diff options
author | Alexander Larsson <alexl@redhat.com> | 2008-02-18 10:46:03 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2008-02-18 10:46:03 +0000 |
commit | 350c0216dccf49ea9adc20cfaa9484a0d6fb93e0 (patch) | |
tree | 9159ae744e5ea2a85ff7b955682272c9d08d1ff0 /daemon/gvfskeyring.c | |
parent | 98ee2150136db7720e531c8d84700f6b912e8c9a (diff) | |
download | gvfs-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.c | 128 |
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 */ +} |