[tracker/miner-web: 44/48] libtracker-miner: Password provider overhaul



commit 03151ca6bb4f4ac85d43cb3fd695cd2bad849aa5
Author: Adrien Bustany <madcat mymadcat com>
Date:   Mon Feb 1 18:12:10 2010 -0300

    libtracker-miner: Password provider overhaul
    
    TrackerPasswordProvider has been rewritten in C, as well as the implementation
    using GKeyFile

 src/libtracker-miner/Makefile.am                   |   13 +-
 src/libtracker-miner/keyfile-password-provider.c   |  393 ++++++++++++++++++++
 .../keyfile-password-provider.vala                 |   85 -----
 src/libtracker-miner/tracker-miner-0.7.vapi        |   13 +-
 src/libtracker-miner/tracker-password-provider.c   |  131 +++++++
 src/libtracker-miner/tracker-password-provider.h   |   84 +++++
 .../vapi/tracker-miner-0.7-custom.vala             |    8 +
 .../vapi/tracker-miner-0.7.metadata                |    6 +-
 8 files changed, 627 insertions(+), 106 deletions(-)
---
diff --git a/src/libtracker-miner/Makefile.am b/src/libtracker-miner/Makefile.am
index 7d4c13d..f3451f4 100644
--- a/src/libtracker-miner/Makefile.am
+++ b/src/libtracker-miner/Makefile.am
@@ -33,8 +33,7 @@ VALAPKGS =                          \
 VALAFLAGS =                         \
 	--vapidir $(top_srcdir)/src/libtracker-miner
 
-libtracker_miner_ TRACKER_API_VERSION@_la_VALASOURCES=     \
-    tracker-password-provider.vala
+libtracker_miner_ TRACKER_API_VERSION@_la_VALASOURCES=
 
 if HAVE_GNOME_KEYRING
 VALAPKGS +=                         \
@@ -47,10 +46,6 @@ INCLUDES +=                         \
 
 libtracker_miner_ TRACKER_API_VERSION@_la_VALASOURCES +=     \
     gnome-password-provider.vala
-else
-# Fallback to KeyFile password support
-libtracker_miner_ TRACKER_API_VERSION@_la_VALASOURCES +=     \
-	keyfile-password-provider.vala
 endif
 
 libtracker_miner_ TRACKER_API_VERSION@_la_SOURCES = 	\
@@ -140,10 +135,6 @@ dbus_sources = 						\
 	tracker-miner-web-glue.h				\
 	tracker-miner-client.h
 
-libtracker-miner-web.vala.stamp: $(libtracker_miner_ TRACKER_API_VERSION@_la_VALASOURCES)
-	$(VALAC) -C $(VALAPKGS) $(VALAFLAGS) -H tracker-password-provider.h $(libtracker_miner_ TRACKER_API_VERSION@_la_VALASOURCES)
-	touch $@
-
 # Custom rule to avoid API duplication. There is also a workaround for bug
 # in dbus-binding-tool where it generates bad code when two files are passed
 # on the command line (though the man page says it supports it)
@@ -161,7 +152,7 @@ tracker-miner-web-glue.h: $(top_srcdir)/data/dbus/tracker-miner-web.xml $(top_sr
 %-client.h: $(top_srcdir)/data/dbus/%.xml
 	$(AM_V_GEN)$(DBUSBINDINGTOOL) --mode=glib-client --output=$@ --prefix=$(subst -,_,$*) $^
 
-BUILT_SOURCES = $(dbus_sources) $(marshal_sources) libtracker-miner-web.vala.stamp tracker-miner-web-full.xml
+BUILT_SOURCES = $(dbus_sources) $(marshal_sources) tracker-miner-web-full.xml
 
 CLEANFILES = $(BUILT_SOURCES)
 
diff --git a/src/libtracker-miner/keyfile-password-provider.c b/src/libtracker-miner/keyfile-password-provider.c
new file mode 100644
index 0000000..d52c9e2
--- /dev/null
+++ b/src/libtracker-miner/keyfile-password-provider.c
@@ -0,0 +1,393 @@
+/* -*- 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 "tracker-password-provider.h"
+
+#define TRACKER_TYPE_PASSWORD_PROVIDER_KEYFILE         (tracker_password_provider_keyfile_get_type())
+#define TRACKER_PASSWORD_PROVIDER_KEYFILE(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_PASSWORD_PROVIDER_KEYFILE, TrackerPasswordProviderKeyfile))
+#define TRACKER_PASSWORD_PROVIDER_KEYFILE_CLASS(c)     (G_TYPE_CHECK_CLASS_CAST ((c),    TRACKER_TYPE_PASSWORD_PROVIDER_KEYFILE, TrackerPasswordProviderKeyfileClass))
+#define TRACKER_IS_PASSWORD_PROVIDER_KEYFILE(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_PASSWORD_PROVIDER_KEYFILE))
+#define TRACKER_IS_PASSWORD_PROVIDER_KEYFILE_CLASS(c)  (G_TYPE_CHECK_CLASS_TYPE ((c),    TRACKER_TYPE_PASSWORD_PROVIDER_KEYFILE))
+#define TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),  TRACKER_TYPE_PASSWORD_PROVIDER_KEYFILE, TrackerPasswordProviderKeyfileClass))
+
+#define TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_PASSWORD_PROVIDER_KEYFILE, TrackerPasswordProviderKeyfilePrivate))
+
+#define PASSWORD_PROVIDER_KEYFILE_NAME "KeyFile"
+
+/* GKeyFile settings */
+#define KEYFILE_FILENAME "passwords.cfg"
+#define GROUP_GENERAL    "General"
+
+typedef struct TrackerPasswordProviderKeyfile TrackerPasswordProviderKeyfile;
+typedef struct TrackerPasswordProviderKeyfileClass TrackerPasswordProviderKeyfileClass;
+typedef struct TrackerPasswordProviderKeyfilePrivate TrackerPasswordProviderKeyfilePrivate;
+
+struct TrackerPasswordProviderKeyfile {
+	GObject parent_instance;
+	TrackerPasswordProviderKeyfilePrivate *private;
+};
+
+struct TrackerPasswordProviderKeyfileClass {
+	GObjectClass parent_class;
+};
+
+struct TrackerPasswordProviderKeyfilePrivate {
+	gchar    *name;
+	GKeyFile *password_file;
+};
+
+enum {
+	PROP_0,
+	PROP_NAME
+};
+
+GType           tracker_password_provider_keyfile_get_type (void) G_GNUC_CONST;
+
+static void     tracker_password_provider_iface_init       (TrackerPasswordProviderIface    *iface);
+static void     password_provider_keyfile_constructed      (GObject                         *object);
+static void     password_provider_keyfile_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_keyfile_store            (TrackerPasswordProvider         *provider,
+                                                            const gchar                     *service,
+                                                            const gchar                     *description,
+                                                            const gchar                     *username,
+                                                            const gchar                     *password,
+                                                            GError                         **error);
+gchar*          password_provider_keyfile_get              (TrackerPasswordProvider         *provider,
+                                                            const gchar                     *service,
+                                                            gchar                          **username,
+                                                            GError                         **error);
+void            password_provider_keyfile_forget           (TrackerPasswordProvider         *provider,
+                                                            const gchar                     *service,
+                                                            GError                         **error);
+
+static void     load_password_file                         (TrackerPasswordProviderKeyfile  *kf);
+static gboolean save_password_file                         (TrackerPasswordProviderKeyfile  *kf);
+
+G_DEFINE_TYPE_WITH_CODE (TrackerPasswordProviderKeyfile,
+                         tracker_password_provider_keyfile,
+                         G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (TRACKER_TYPE_PASSWORD_PROVIDER,
+                                                tracker_password_provider_iface_init))
+
+static void
+tracker_password_provider_keyfile_class_init (TrackerPasswordProviderKeyfileClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->finalize     = password_provider_keyfile_finalize;
+	object_class->constructed  = password_provider_keyfile_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 (TrackerPasswordProviderKeyfilePrivate));
+}
+
+static void
+tracker_password_provider_keyfile_init (TrackerPasswordProviderKeyfile *provider)
+{
+	TrackerPasswordProviderKeyfilePrivate *priv;
+
+	priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (provider);
+}
+
+static void
+tracker_password_provider_iface_init (TrackerPasswordProviderIface *iface)
+{
+	iface->store_password = password_provider_keyfile_store;
+	iface->get_password = password_provider_keyfile_get;
+	iface->forget_password = password_provider_keyfile_forget;
+}
+
+static void
+password_provider_keyfile_constructed (GObject *object)
+{
+	TrackerPasswordProviderKeyfile *kf = TRACKER_PASSWORD_PROVIDER_KEYFILE (object);
+	TrackerPasswordProviderKeyfilePrivate *priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (kf);
+
+	priv->password_file = g_key_file_new ();
+
+	load_password_file (kf);
+}
+
+static void
+password_provider_keyfile_finalize (GObject *object)
+{
+	TrackerPasswordProviderKeyfile *kf = TRACKER_PASSWORD_PROVIDER_KEYFILE (object);
+	TrackerPasswordProviderKeyfilePrivate *priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (kf);
+
+	g_key_file_free (priv->password_file);
+
+	G_OBJECT_CLASS (tracker_password_provider_keyfile_parent_class)->finalize (object);
+}
+
+static void
+password_provider_set_property (GObject      *object,
+                                guint         prop_id,
+                                const GValue *value,
+                                GParamSpec   *pspec)
+{
+	TrackerPasswordProviderKeyfile *kf = TRACKER_PASSWORD_PROVIDER_KEYFILE (object);
+	TrackerPasswordProviderKeyfilePrivate *priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (kf);
+
+	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)
+{
+	TrackerPasswordProviderKeyfile *kf = TRACKER_PASSWORD_PROVIDER_KEYFILE (object);
+	TrackerPasswordProviderKeyfilePrivate *priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (kf);
+
+	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_keyfile_store (TrackerPasswordProvider  *provider,
+                                 const gchar              *service,
+                                 const gchar              *description,
+                                 const gchar              *username,
+                                 const gchar              *password,
+                                 GError                  **error)
+{
+	TrackerPasswordProviderKeyfile *kf = TRACKER_PASSWORD_PROVIDER_KEYFILE (provider);
+	TrackerPasswordProviderKeyfilePrivate *priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (kf);
+
+	g_key_file_set_string (priv->password_file,
+	                       service,
+	                       "description",
+	                       description);
+	g_key_file_set_string (priv->password_file,
+	                       service,
+	                       "username",
+	                       username);
+	g_key_file_set_string (priv->password_file,
+	                       service,
+	                       "password",
+	                       password);
+
+	if (!save_password_file (kf)) {
+		g_set_error_literal (error,
+                             TRACKER_PASSWORD_PROVIDER_ERROR,
+                             TRACKER_PASSWORD_PROVIDER_ERROR_SERVICE,
+                             "Cannot write password file");
+	}
+}
+
+gchar*
+password_provider_keyfile_get (TrackerPasswordProvider  *provider,
+                               const gchar              *service,
+                               gchar                   **username,
+                               GError                  **error)
+{
+	TrackerPasswordProviderKeyfile *kf = TRACKER_PASSWORD_PROVIDER_KEYFILE (provider);
+	TrackerPasswordProviderKeyfilePrivate *priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (kf);
+
+	gchar *password;
+
+	GError *e1 = NULL;
+	GError *e2 = NULL;
+
+	password = g_key_file_get_string (priv->password_file,
+	                                  service,
+						              "password",
+						              &e1);
+
+	if (username) {
+		*username = g_key_file_get_string (priv->password_file,
+		                                   service,
+		                                   "username",
+		                                   &e2);
+	}
+
+	if (e1 || e2) {
+		g_set_error_literal (error,
+                             TRACKER_PASSWORD_PROVIDER_ERROR,
+                             TRACKER_PASSWORD_PROVIDER_ERROR_NOTFOUND,
+                             "Password not found");
+	}
+
+	if (e1)
+		g_error_free (e1);
+	if (e2)
+		g_error_free (e2);
+
+	return password;
+}
+
+void
+password_provider_keyfile_forget (TrackerPasswordProvider  *provider,
+                                  const gchar              *service,
+                                  GError                  **error)
+{
+	TrackerPasswordProviderKeyfile *kf = TRACKER_PASSWORD_PROVIDER_KEYFILE (provider);
+	TrackerPasswordProviderKeyfilePrivate *priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (kf);
+
+	GError *e = NULL;
+
+	if (!g_key_file_remove_group (priv->password_file, service, &e)) {
+		g_warning ("Cannot remove group '%s' from password file: %s",
+		           service,
+		           e->message);
+		g_error_free (e);
+
+		g_set_error_literal (error,
+                             TRACKER_PASSWORD_PROVIDER_ERROR,
+                             TRACKER_PASSWORD_PROVIDER_ERROR_NOTFOUND,
+                             "Service not found");
+	}
+}
+
+const TrackerPasswordProvider*
+tracker_get_password_provider (void)
+{
+	static TrackerPasswordProvider *instance = NULL;
+
+	if (instance == NULL) {
+		instance = g_object_new (TRACKER_TYPE_PASSWORD_PROVIDER_KEYFILE,
+		                         "name", PASSWORD_PROVIDER_KEYFILE_NAME,
+		                         NULL);
+	}
+
+	g_assert (instance != NULL);
+
+	return instance;
+}
+
+/* Copied from tracker-config-file.c */
+static gchar *
+config_dir_ensure_exists_and_return (void)
+{
+	gchar *directory;
+
+	directory = g_build_filename (g_get_user_config_dir (),
+			"tracker",
+			NULL);
+
+	if (!g_file_test (directory, G_FILE_TEST_EXISTS)) {
+		g_print ("Creating config directory:'%s'\n", directory);
+
+		if (g_mkdir_with_parents (directory, 0700) == -1) {
+			g_critical ("Could not create configuration directory");
+			g_free (directory);
+			return NULL;
+		}
+	}
+
+	return directory;
+}
+
+static void
+load_password_file (TrackerPasswordProviderKeyfile *kf)
+{
+	TrackerPasswordProviderKeyfilePrivate *priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (kf);
+	gchar *filename;
+	gchar *directory;
+
+	GError *error = NULL;
+
+	directory = config_dir_ensure_exists_and_return ();
+	if (!directory) {
+		return;
+	}
+
+	filename = g_build_filename (directory, KEYFILE_FILENAME, NULL);
+	g_free (directory);
+
+	if (!g_file_test (filename, G_FILE_TEST_EXISTS)) {
+		return;
+	}
+
+	g_key_file_load_from_file (priv->password_file,
+	                           filename,
+	                           G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS,
+	                           &error);
+
+	if (error) {
+		g_critical ("Cannot load password file: %s", error->message);
+		g_error_free (error);
+	}
+}
+
+static gboolean
+save_password_file (TrackerPasswordProviderKeyfile *kf)
+{
+	TrackerPasswordProviderKeyfilePrivate *priv = TRACKER_PASSWORD_PROVIDER_KEYFILE_GET_PRIVATE (kf);
+	gchar *filename;
+	gchar *directory;
+	gchar *data;
+	gsize size;
+
+	GError *error = NULL;
+
+	directory = config_dir_ensure_exists_and_return ();
+	if (!directory) {
+		return FALSE;
+	}
+
+	filename = g_build_filename (directory, KEYFILE_FILENAME, NULL);
+	g_free (directory);
+
+	data = g_key_file_to_data (priv->password_file, &size, NULL);
+
+	g_file_set_contents (filename, data, size, &error);
+	g_free (data);
+	g_free (filename);
+
+	if (error) {
+		g_warning ("Couldn't write password file : %s", error->message);
+		g_error_free (error);
+		return FALSE;
+	}
+
+	return TRUE;
+}
diff --git a/src/libtracker-miner/tracker-miner-0.7.vapi b/src/libtracker-miner/tracker-miner-0.7.vapi
index b1fb518..eae382d 100644
--- a/src/libtracker-miner/tracker-miner-0.7.vapi
+++ b/src/libtracker-miner/tracker-miner-0.7.vapi
@@ -43,14 +43,11 @@ namespace Tracker {
 		public static GLib.Quark error_quark ();
 		public virtual GLib.HashTable get_association_data () throws Tracker.MinerWebError;
 	}
-	[Compact]
 	[CCode (cheader_filename = "libtracker-miner/tracker-password-provider.h")]
-	public class PasswordProvider {
-		public static GLib.Quark error_quark ();
+	public interface PasswordProvider : GLib.Object {
 		public void forget_password (string service) throws GLib.Error;
 		public unowned string get_name ();
-		public unowned string get_password (string service, out unowned string username) throws GLib.Error;
-		public static unowned Tracker.PasswordProvider get_password_provider ();
+		public string get_password (string service, out string username) throws GLib.Error;
 		public void store_password (string service, string description, string username, string password) throws GLib.Error;
 	}
 	[CCode (cprefix = "TRACKER_MINER_WEB_", has_type_id = "0", cheader_filename = "libtracker-miner/tracker-miner-web.h")]
@@ -79,9 +76,7 @@ namespace Tracker {
 	[CCode (cheader_filename = "libtracker-miner/tracker-miner.h")]
 	public const string MINER_DBUS_PATH_PREFIX;
 	[CCode (cheader_filename = "libtracker-miner/tracker-miner.h")]
-	public const string MINER_ERROR_DOMAIN;
-	[CCode (cheader_filename = "libtracker-miner/tracker-miner.h")]
 	public const string MINER_WEB_DBUS_INTERFACE;
-	[CCode (cheader_filename = "libtracker-miner/tracker-miner.h")]
-	public const string MINER_WEB_ERROR_DOMAIN;
+	[CCode (cheader_filename = "libtracker-miner/tracker-password-provider.h")]
+	public static unowned Tracker.PasswordProvider get_password_provider ();
 }
diff --git a/src/libtracker-miner/tracker-password-provider.c b/src/libtracker-miner/tracker-password-provider.c
new file mode 100644
index 0000000..1172911
--- /dev/null
+++ b/src/libtracker-miner/tracker-password-provider.c
@@ -0,0 +1,131 @@
+/*
+ * 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 "tracker-password-provider.h"
+
+#include "config.h"
+
+/* for mlock */
+#include <sys/mman.h>
+
+static void
+tracker_password_provider_init (gpointer object_class)
+{
+	static gboolean is_initialized = FALSE;
+
+	if (!is_initialized) {
+		g_object_interface_install_property (object_class,
+		                                     g_param_spec_string ("name",
+		                                                          "Password provider name",
+		                                                          "Password provider name",
+		                                                          NULL,
+		                                                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+		is_initialized = TRUE;
+	}
+}
+
+GType
+tracker_password_provider_get_type (void)
+{
+	static GType iface_type = 0;
+
+	if (iface_type == 0) {
+		static const GTypeInfo info = {
+			sizeof (TrackerPasswordProviderIface),
+			tracker_password_provider_init,
+			NULL
+		};
+
+		iface_type = g_type_register_static (G_TYPE_INTERFACE,
+		                                     "TrackerPasswordProvider",
+		                                     &info,
+		                                     0);
+	}
+
+	return iface_type;
+}
+
+GQuark
+tracker_password_provider_error_quark (void)
+{
+	return g_quark_from_static_string (TRACKER_PASSWORD_PROVIDER_ERROR_DOMAIN);
+}
+
+gchar*
+tracker_password_provider_get_name (TrackerPasswordProvider *provider)
+{
+	g_assert (TRACKER_IS_PASSWORD_PROVIDER (provider));
+
+	gchar *name;
+	g_object_get (provider,
+	              "name", &name,
+	              NULL);
+
+	return name;
+}
+
+void
+tracker_password_provider_store_password (TrackerPasswordProvider   *provider,
+                                           const gchar               *service,
+                                           const gchar               *description,
+                                           const gchar               *username,
+                                           const gchar               *password,
+                                           GError                   **error)
+{
+	g_assert (TRACKER_IS_PASSWORD_PROVIDER (provider));
+
+	TRACKER_PASSWORD_PROVIDER_GET_INTERFACE (provider)->store_password (provider,
+	                                                                    service,
+	                                                                    description,
+	                                                                    username,
+	                                                                    password,
+	                                                                    error);
+}
+
+gchar*
+tracker_password_provider_get_password (TrackerPasswordProvider   *provider,
+                                        const gchar               *service,
+                                        gchar                    **username,
+                                        GError                   **error)
+{
+	g_assert (TRACKER_IS_PASSWORD_PROVIDER (provider));
+
+	gchar *password = TRACKER_PASSWORD_PROVIDER_GET_INTERFACE (provider)->get_password (provider,
+	                                                                                    service,
+	                                                                                    username,
+	                                                                                    error);
+	/* This locking is not perfect since the process can be swapped before the mlock call...
+	 * gnome-keyring has a better implementation using a pool of locked memory to allocate the
+	 * password, but it's much more complex :-/
+	 */
+	mlock (password, sizeof (password));
+	return password;
+}
+
+void
+tracker_password_provider_forget_password (TrackerPasswordProvider   *provider,
+                                           const gchar               *service,
+                                           GError                   **error)
+{
+	g_assert (TRACKER_IS_PASSWORD_PROVIDER (provider));
+
+	TRACKER_PASSWORD_PROVIDER_GET_INTERFACE (provider)->forget_password (provider,
+	                                                                     service,
+	                                                                     error);
+}
diff --git a/src/libtracker-miner/tracker-password-provider.h b/src/libtracker-miner/tracker-password-provider.h
new file mode 100644
index 0000000..ff6ae66
--- /dev/null
+++ b/src/libtracker-miner/tracker-password-provider.h
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+#ifndef __TRACKER_PASSWORD_PROVIDER_H__
+#define __TRACKER_PASSWORD_PROVIDER_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_PASSWORD_PROVIDER         (tracker_password_provider_get_type())
+#define TRACKER_PASSWORD_PROVIDER(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_PASSWORD_PROVIDER, TrackerPasswordProvider))
+#define TRACKER_IS_PASSWORD_PROVIDER(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_PASSWORD_PROVIDER))
+#define TRACKER_PASSWORD_PROVIDER_GET_INTERFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o),  TRACKER_TYPE_PASSWORD_PROVIDER, TrackerPasswordProviderIface))
+
+#define TRACKER_PASSWORD_PROVIDER_ERROR_DOMAIN  "TrackerPasswordProvider"
+#define TRACKER_PASSWORD_PROVIDER_ERROR         tracker_password_provider_error_quark()
+
+typedef struct TrackerPasswordProvider TrackerPasswordProvider;
+typedef struct TrackerPasswordProviderIface TrackerPasswordProviderIface;
+
+typedef enum {
+	TRACKER_PASSWORD_PROVIDER_ERROR_SERVICE,
+	TRACKER_PASSWORD_PROVIDER_ERROR_NOTFOUND
+} TrackerPasswordProviderError;
+
+struct TrackerPasswordProviderIface
+{
+	GTypeInterface parent_iface;
+
+	void     (* store_password)        (TrackerPasswordProvider  *provider,
+	                                    const gchar              *service,
+	                                    const gchar              *description,
+	                                    const gchar              *username,
+	                                    const gchar              *password,
+	                                    GError                  **error);
+	gchar*   (* get_password)          (TrackerPasswordProvider  *provider,
+	                                    const gchar              *service,
+	                                    gchar                   **username,
+	                                    GError                  **error);
+	void     (* forget_password)       (TrackerPasswordProvider  *provider,
+	                                    const gchar              *service,
+	                                    GError                  **error);
+};
+
+GType                          tracker_password_provider_get_type        (void) G_GNUC_CONST;
+GQuark                         tracker_password_provider_error_quark     (void);
+
+gchar*                         tracker_password_provider_get_name        (TrackerPasswordProvider   *provider);
+/* Must be defined by the selected implementation */
+const TrackerPasswordProvider* tracker_get_password_provider             (void);
+void                           tracker_password_provider_store_password  (TrackerPasswordProvider   *provider,
+	                                                                      const gchar              *service,
+	                                                                      const gchar              *description,
+	                                                                      const gchar              *username,
+	                                                                      const gchar              *password,
+	                                                                      GError                  **error);
+
+gchar*                         tracker_password_provider_get_password    (TrackerPasswordProvider   *provider,
+	                                                                      const gchar              *service,
+	                                                                      gchar                   **username,
+	                                                                      GError                  **error);
+void                           tracker_password_provider_forget_password (TrackerPasswordProvider   *provider,
+	                                                                      const gchar              *service,
+	                                                                      GError                  **error);
+G_END_DECLS
+
+#endif
diff --git a/src/libtracker-miner/vapi/tracker-miner-0.7-custom.vala b/src/libtracker-miner/vapi/tracker-miner-0.7-custom.vala
index b7c944d..baa973f 100644
--- a/src/libtracker-miner/vapi/tracker-miner-0.7-custom.vala
+++ b/src/libtracker-miner/vapi/tracker-miner-0.7-custom.vala
@@ -35,4 +35,12 @@ namespace Tracker {
 		public virtual void dissociate () throws MinerWebError;
 		public virtual GLib.HashTable get_association_data () throws MinerWebError;
 	}
+
+	[CCode (cheader_filename = "libtracker-miner/tracker-password-provider.h")]
+	public interface PasswordProvider : GLib.Object {
+		public void store_password (string service, string description, string username, string password) throws GLib.Error;
+		public string get_password (string service, out string username) throws GLib.Error;
+		public void forget_password (string service) throws GLib.Error;
+		public unowned string get_name ();
+	}
 }
diff --git a/src/libtracker-miner/vapi/tracker-miner-0.7.metadata b/src/libtracker-miner/vapi/tracker-miner-0.7.metadata
index 7fe5bd7..f1ec439 100644
--- a/src/libtracker-miner/vapi/tracker-miner-0.7.metadata
+++ b/src/libtracker-miner/vapi/tracker-miner-0.7.metadata
@@ -30,4 +30,8 @@ tracker_miner_web_authenticate hidden="1"
 tracker_miner_web_get_association_data hidden="1"
 TrackerPasswordProviderIface hidden="1"
 TrackerPasswordProviderError errordomain="1" cheader_filename="libtracker-miner/tracker-password-provider.h"
-TrackerPasswordProvider cheader_filename="libtracker-miner/tracker-password-provider.h"
+TrackerPasswordProvider hidden="1"
+TRACKER_MINER_ERROR_DOMAIN hidden="1"
+TRACKER_MINER_WEB_ERROR_DOMAIN hidden="1"
+TRACKER_PASSWORD_PROVIDER_ERROR_DOMAIN hidden="1"
+tracker_get_password_provider cheader_filename="libtracker-miner/tracker-password-provider.h"



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