[tracker/miner-web: 47/48] libtracker-miner: Port Gnome password provider to C
- From: Adrien Bustany <abustany src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/miner-web: 47/48] libtracker-miner: Port Gnome password provider to C
- Date: Tue, 2 Feb 2010 22:11:16 +0000 (UTC)
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]