[tracker/miner-web: 47/48] libtracker-miner: Port Gnome password provider to C



commit 3dccd36b87131287213ea8cd5a8df88187049df7
Author: Adrien Bustany <madcat mymadcat com>
Date:   Tue Feb 2 18:47:31 2010 -0300

    libtracker-miner: Port Gnome password provider to C

 src/libtracker-miner/Makefile.am                  |   26 +--
 src/libtracker-miner/gnome-password-provider.c    |  304 +++++++++++++++++++++
 src/libtracker-miner/gnome-password-provider.vala |   69 -----
 3 files changed, 307 insertions(+), 92 deletions(-)
---
diff --git a/src/libtracker-miner/Makefile.am b/src/libtracker-miner/Makefile.am
index 5d1f702..ef13dcd 100644
--- a/src/libtracker-miner/Makefile.am
+++ b/src/libtracker-miner/Makefile.am
@@ -25,29 +25,6 @@ lib_LTLIBRARIES = libtracker-miner- TRACKER_API_VERSION@.la
 libtracker_minerdir = $(libdir)/tracker-$(TRACKER_API_VERSION)
 libtracker_minerincludedir=$(includedir)/tracker-$(TRACKER_API_VERSION)/libtracker-miner/
 
-VALAPKGS =                          \
-	--pkg dbus-glib-1               \
-	--pkg posix                     \
-	--pkg gio-2.0
-
-VALAFLAGS =                         \
-	--vapidir $(top_srcdir)/src/libtracker-miner
-
-libtracker_miner_ TRACKER_API_VERSION@_la_VALASOURCES=
-
-if HAVE_GNOME_KEYRING
-VALAPKGS +=                         \
-	--pkg gnome-keyring-1
-VALAFLAGS +=                        \
-	-D HAVE_GNOME_KEYRING
-
-INCLUDES +=                         \
-	$(GNOME_KEYRING_CFLAGS)
-
-libtracker_miner_ TRACKER_API_VERSION@_la_VALASOURCES +=     \
-    gnome-password-provider.vala
-endif
-
 libtracker_miner_ TRACKER_API_VERSION@_la_SOURCES = 	\
 	tracker-crawler.c				\
 	tracker-crawler.h				\
@@ -103,6 +80,9 @@ libtracker_miner_ TRACKER_API_VERSION@_la_SOURCES += 	\
 
 libtracker_miner_ TRACKER_API_VERSION@_la_LIBADD +=       \
 	$(GNOME_KEYRING_LIBS)
+
+INCLUDES +=                         \
+	$(GNOME_KEYRING_CFLAGS)
 else
 libtracker_miner_ TRACKER_API_VERSION@_la_SOURCES += 	\
 	keyfile-password-provider.c
diff --git a/src/libtracker-miner/gnome-password-provider.c b/src/libtracker-miner/gnome-password-provider.c
new file mode 100644
index 0000000..8c892b4
--- /dev/null
+++ b/src/libtracker-miner/gnome-password-provider.c
@@ -0,0 +1,304 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2009, Adrien Bustany (abustany gnome org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#include <glib-object.h>
+#include <gnome-keyring.h>
+
+#include "tracker-password-provider.h"
+
+#define TRACKER_TYPE_PASSWORD_PROVIDER_GNOME         (tracker_password_provider_gnome_get_type())
+#define TRACKER_PASSWORD_PROVIDER_GNOME(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_PASSWORD_PROVIDER_GNOME, TrackerPasswordProviderGnome))
+#define TRACKER_PASSWORD_PROVIDER_GNOME_CLASS(c)     (G_TYPE_CHECK_CLASS_CAST ((c),    TRACKER_TYPE_PASSWORD_PROVIDER_GNOME, TrackerPasswordProviderGnomeClass))
+#define TRACKER_IS_PASSWORD_PROVIDER_GNOME(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_PASSWORD_PROVIDER_GNOME))
+#define TRACKER_IS_PASSWORD_PROVIDER_GNOME_CLASS(c)  (G_TYPE_CHECK_CLASS_TYPE ((c),    TRACKER_TYPE_PASSWORD_PROVIDER_GNOME))
+#define TRACKER_PASSWORD_PROVIDER_GNOME_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),  TRACKER_TYPE_PASSWORD_PROVIDER_GNOME, TrackerPasswordProviderGnomeClass))
+
+#define TRACKER_PASSWORD_PROVIDER_GNOME_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_PASSWORD_PROVIDER_GNOME, TrackerPasswordProviderGnomePrivate))
+
+#define PASSWORD_PROVIDER_GNOME_NAME "Gnome keyring"
+
+typedef struct TrackerPasswordProviderGnome TrackerPasswordProviderGnome;
+typedef struct TrackerPasswordProviderGnomeClass TrackerPasswordProviderGnomeClass;
+typedef struct TrackerPasswordProviderGnomePrivate TrackerPasswordProviderGnomePrivate;
+
+struct TrackerPasswordProviderGnome {
+	GObject parent_instance;
+	TrackerPasswordProviderGnomePrivate *private;
+};
+
+struct TrackerPasswordProviderGnomeClass {
+	GObjectClass parent_class;
+};
+
+struct TrackerPasswordProviderGnomePrivate {
+	gchar    *name;
+};
+
+const GnomeKeyringPasswordSchema password_schema = {
+	GNOME_KEYRING_ITEM_GENERIC_SECRET,
+	{
+		{ "service", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
+		{ "username", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
+		{ NULL, 0 }
+	}
+};
+
+enum {
+	PROP_0,
+	PROP_NAME
+};
+
+GType           tracker_password_provider_gnome_get_type (void) G_GNUC_CONST;
+
+static void     tracker_password_provider_iface_init       (TrackerPasswordProviderIface    *iface);
+static void     password_provider_gnome_constructed      (GObject                         *object);
+static void     password_provider_gnome_finalize         (GObject                         *object);
+static void     password_provider_set_property             (GObject                         *object,
+                                                            guint                            prop_id,
+                                                            const GValue                    *value,
+                                                            GParamSpec                      *pspec);
+static void     password_provider_get_property             (GObject                         *object,
+                                                            guint                            prop_id,
+                                                            GValue                          *value,
+                                                            GParamSpec                      *pspec);
+
+void            password_provider_gnome_store            (TrackerPasswordProvider         *provider,
+                                                            const gchar                     *service,
+                                                            const gchar                     *description,
+                                                            const gchar                     *username,
+                                                            const gchar                     *password,
+                                                            GError                         **error);
+gchar*          password_provider_gnome_get              (TrackerPasswordProvider         *provider,
+                                                            const gchar                     *service,
+                                                            gchar                          **username,
+                                                            GError                         **error);
+void            password_provider_gnome_forget           (TrackerPasswordProvider         *provider,
+                                                            const gchar                     *service,
+                                                            GError                         **error);
+
+G_DEFINE_TYPE_WITH_CODE (TrackerPasswordProviderGnome,
+                         tracker_password_provider_gnome,
+                         G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (TRACKER_TYPE_PASSWORD_PROVIDER,
+                                                tracker_password_provider_iface_init))
+
+static void
+tracker_password_provider_gnome_class_init (TrackerPasswordProviderGnomeClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->finalize     = password_provider_gnome_finalize;
+	object_class->constructed  = password_provider_gnome_constructed;
+	object_class->set_property = password_provider_set_property;
+	object_class->get_property = password_provider_get_property;
+
+	g_object_class_override_property (object_class,
+	                                  PROP_NAME,
+	                                  "name");
+	g_type_class_add_private (object_class,
+	                          sizeof (TrackerPasswordProviderGnomePrivate));
+}
+
+static void
+tracker_password_provider_gnome_init (TrackerPasswordProviderGnome *provider)
+{
+	TrackerPasswordProviderGnomePrivate *priv;
+
+	priv = TRACKER_PASSWORD_PROVIDER_GNOME_GET_PRIVATE (provider);
+}
+
+static void
+tracker_password_provider_iface_init (TrackerPasswordProviderIface *iface)
+{
+	iface->store_password = password_provider_gnome_store;
+	iface->get_password = password_provider_gnome_get;
+	iface->forget_password = password_provider_gnome_forget;
+}
+
+static void
+password_provider_gnome_constructed (GObject *object)
+{
+}
+
+static void
+password_provider_gnome_finalize (GObject *object)
+{
+	G_OBJECT_CLASS (tracker_password_provider_gnome_parent_class)->finalize (object);
+}
+
+static void
+password_provider_set_property (GObject      *object,
+                                guint         prop_id,
+                                const GValue *value,
+                                GParamSpec   *pspec)
+{
+	TrackerPasswordProviderGnome *gnome_provider = TRACKER_PASSWORD_PROVIDER_GNOME (object);
+	TrackerPasswordProviderGnomePrivate *priv = TRACKER_PASSWORD_PROVIDER_GNOME_GET_PRIVATE (gnome_provider);
+
+	switch (prop_id) {
+		case PROP_NAME:
+			g_free (priv->name);
+			priv->name = g_value_dup_string (value);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+			break;
+	};
+}
+
+static void
+password_provider_get_property (GObject      *object,
+                                guint         prop_id,
+                                GValue       *value,
+                                GParamSpec   *pspec)
+{
+	TrackerPasswordProviderGnome *gnome_provider = TRACKER_PASSWORD_PROVIDER_GNOME (object);
+	TrackerPasswordProviderGnomePrivate *priv = TRACKER_PASSWORD_PROVIDER_GNOME_GET_PRIVATE (gnome_provider);
+
+	switch (prop_id) {
+		case PROP_NAME:
+			g_value_set_string (value, priv->name);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+			break;
+	};
+}
+
+void
+password_provider_gnome_store (TrackerPasswordProvider  *provider,
+                                 const gchar              *service,
+                                 const gchar              *description,
+                                 const gchar              *username,
+                                 const gchar              *password,
+                                 GError                  **error)
+{
+	GnomeKeyringResult r = gnome_keyring_store_password_sync (&password_schema,
+	                                                          NULL,
+	                                                          description,
+	                                                          password,
+	                                                          "service", service,
+	                                                          "username", username,
+	                                                          NULL);
+	if (r != GNOME_KEYRING_RESULT_OK) {
+		g_set_error_literal (error,
+                             TRACKER_PASSWORD_PROVIDER_ERROR,
+                             TRACKER_PASSWORD_PROVIDER_ERROR_SERVICE,
+                             "Cannot store password in Gnome keyring");
+	}
+}
+
+gchar*
+password_provider_gnome_get (TrackerPasswordProvider  *provider,
+                             const gchar              *service,
+                             gchar                   **username,
+                             GError                  **error)
+{
+	gchar *password;
+	GnomeKeyringAttributeList *search_attributes;
+	GList *found_items = NULL;
+
+	GnomeKeyringAttribute service_attr = {
+		"service",
+		GNOME_KEYRING_ATTRIBUTE_TYPE_STRING,
+		{ service }
+	};
+
+	search_attributes = g_array_sized_new (FALSE,
+	                                       FALSE,
+	                                       sizeof (GnomeKeyringAttribute),
+	                                       1);
+
+	g_array_append_val (search_attributes, service_attr);
+
+	GnomeKeyringResult r = gnome_keyring_find_items_sync (GNOME_KEYRING_ITEM_GENERIC_SECRET,
+	                                                      search_attributes,
+	                                                      &found_items);
+
+	if (r != GNOME_KEYRING_RESULT_OK) {
+		if (r == GNOME_KEYRING_RESULT_NO_MATCH) {
+			g_set_error_literal (error,
+	                             TRACKER_PASSWORD_PROVIDER_ERROR,
+	                             TRACKER_PASSWORD_PROVIDER_ERROR_NOTFOUND,
+	                             "Password not found");
+		} else {
+			g_set_error (error,
+	                     TRACKER_PASSWORD_PROVIDER_ERROR,
+	                     TRACKER_PASSWORD_PROVIDER_ERROR_SERVICE,
+	                     "Keyring error: %s",
+	                     gnome_keyring_result_to_message (r));
+		}
+
+		gnome_keyring_found_list_free (found_items);
+		return NULL;
+	}
+
+	GnomeKeyringFound *found = (GnomeKeyringFound *)(g_list_first (found_items));
+
+	/* Walk through all attributes and select the ones we're interested in */
+	gint i;
+	for (i = 0 ; i < found->attributes->len ; ++i) {
+		GnomeKeyringAttribute *attr = &g_array_index (found->attributes, GnomeKeyringAttribute, i);
+		if (g_strcmp0 (attr->name, "username") && username) {
+			*username = g_strdup (attr->value.string);
+		}
+	}
+
+	password = g_strdup (found->secret);
+
+	gnome_keyring_found_list_free (found_items);
+
+	return password;
+}
+
+void
+password_provider_gnome_forget (TrackerPasswordProvider  *provider,
+                                  const gchar              *service,
+                                  GError                  **error)
+{
+	GnomeKeyringResult r = gnome_keyring_delete_password_sync (&password_schema,
+	                                                           "service", service,
+	                                                           NULL);
+
+	if (r != GNOME_KEYRING_RESULT_OK) {
+		g_set_error (error,
+                     TRACKER_PASSWORD_PROVIDER_ERROR,
+                     TRACKER_PASSWORD_PROVIDER_ERROR_SERVICE,
+                     "Cannot delete password: %s",
+                     gnome_keyring_result_to_message (r));
+	}
+}
+
+const TrackerPasswordProvider*
+tracker_get_password_provider (void)
+{
+	static TrackerPasswordProvider *instance = NULL;
+
+	if (instance == NULL) {
+		instance = g_object_new (TRACKER_TYPE_PASSWORD_PROVIDER_GNOME,
+		                         "name", PASSWORD_PROVIDER_GNOME_NAME,
+		                         NULL);
+	}
+
+	g_assert (instance != NULL);
+
+	return instance;
+}
+



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