summaryrefslogtreecommitdiff
path: root/daemon/gvfskeyring.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2008-02-18 10:46:03 +0000
committerAlexander Larsson <alexl@src.gnome.org>2008-02-18 10:46:03 +0000
commit350c0216dccf49ea9adc20cfaa9484a0d6fb93e0 (patch)
tree9159ae744e5ea2a85ff7b955682272c9d08d1ff0 /daemon/gvfskeyring.c
parent98ee2150136db7720e531c8d84700f6b912e8c9a (diff)
downloadgvfs-350c0216dccf49ea9adc20cfaa9484a0d6fb93e0.tar.gz
Detect gnome-keyring
2008-02-18 Alexander Larsson <alexl@redhat.com> * configure.ac: Detect gnome-keyring * common/gmountsource.[ch]: Add password out to ask_password * daemon/Makefile.am: * daemon/gvfskeyring.[ch]: Helper code for keyring support * daemon/gvfsbackendsftp.c: Add keyring support * daemon/gvfsbackenddav.c: * daemon/gvfsbackendsmb.c: Update to api changes This is the initial work on keyring support (#511517) Patch from Carlos Garcia Campos svn path=/trunk/; revision=1293
Diffstat (limited to 'daemon/gvfskeyring.c')
-rw-r--r--daemon/gvfskeyring.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/daemon/gvfskeyring.c b/daemon/gvfskeyring.c
new file mode 100644
index 00000000..583db085
--- /dev/null
+++ b/daemon/gvfskeyring.c
@@ -0,0 +1,128 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* GIO - GLib Input, Output and Streaming Library
+ *
+ * Copyright (C) 2008 Carlos Garcia Campos
+ *
+ * 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 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., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Author: Carlos Garcia Campos <carlosgc@gnome.org>
+ */
+
+#include <config.h>
+
+#ifdef HAVE_KEYRING
+#include <gnome-keyring.h>
+#endif
+
+#include "gvfskeyring.h"
+
+gboolean
+g_vfs_keyring_is_available (void)
+{
+#ifdef HAVE_KEYRING
+ return gnome_keyring_is_available ();
+#else
+ return FALSE;
+#endif
+}
+
+gboolean
+g_vfs_keyring_lookup_password (const gchar *username,
+ const gchar *host,
+ const gchar *domain,
+ const gchar *protocol,
+ gchar **username_out,
+ gchar **domain_out,
+ gchar **password_out)
+{
+#ifdef HAVE_KEYRING
+ GnomeKeyringNetworkPasswordData *pwd_data;
+ GnomeKeyringResult result;
+ GList *plist;
+
+ if (!gnome_keyring_is_available ())
+ return FALSE;
+
+ result = gnome_keyring_find_network_password_sync (
+ username,
+ domain,
+ host,
+ NULL,
+ protocol,
+ NULL,
+ 0,
+ &plist);
+
+ if (result != GNOME_KEYRING_RESULT_OK || plist == NULL)
+ return FALSE;
+
+ /* We use the first result, which is the least specific match */
+ pwd_data = (GnomeKeyringNetworkPasswordData *)plist->data;
+
+ *password_out = g_strdup (pwd_data->password);
+
+ if (username_out)
+ *username_out = g_strdup (pwd_data->user);
+
+ if (domain_out)
+ *domain_out = g_strdup (pwd_data->domain);
+
+ gnome_keyring_network_password_list_free (plist);
+
+ return TRUE;
+#else
+ return FALSE;
+#endif /* HAVE_KEYRING */
+}
+
+gboolean
+g_vfs_keyring_save_password (const gchar *username,
+ const gchar *host,
+ const gchar *domain,
+ const gchar *protocol,
+ const gchar *password,
+ GPasswordSave flags)
+{
+#ifdef HAVE_KEYRING
+ GnomeKeyringResult result;
+ const gchar *keyring;
+ guint32 item_id;
+
+ if (!gnome_keyring_is_available ())
+ return FALSE;
+
+ if (flags == G_PASSWORD_SAVE_NEVER)
+ return FALSE;
+
+ keyring = (flags == G_PASSWORD_SAVE_FOR_SESSION) ? "session" : NULL;
+
+ result = gnome_keyring_set_network_password_sync (
+ keyring,
+ username,
+ domain,
+ host,
+ NULL,
+ protocol,
+ NULL,
+ 0,
+ password,
+ &item_id);
+
+ return (result == GNOME_KEYRING_RESULT_OK);
+#else
+ return FALSE;
+#endif /* HAVE_KEYRING */
+}