[tracker/miner-web: 44/49] libtracker-miner: Password provider overhaul
- From: Adrien Bustany <abustany src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/miner-web: 44/49] libtracker-miner: Password provider overhaul
- Date: Tue, 2 Feb 2010 22:13:17 +0000 (UTC)
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]