gvfs r1365 - in trunk: . daemon



Author: alexl
Date: Mon Feb 25 14:15:40 2008
New Revision: 1365
URL: http://svn.gnome.org/viewvc/gvfs?rev=1365&view=rev

Log:
2008-02-25  Alexander Larsson  <alexl redhat com>

        * daemon/gvfsbackendsmb.c:
	Support gnome-keyring (#511517)
	Patch from Carlos Garcia Campos



Modified:
   trunk/ChangeLog
   trunk/daemon/gvfsbackendsmb.c

Modified: trunk/daemon/gvfsbackendsmb.c
==============================================================================
--- trunk/daemon/gvfsbackendsmb.c	(original)
+++ trunk/daemon/gvfsbackendsmb.c	Mon Feb 25 14:15:40 2008
@@ -47,6 +47,7 @@
 #include "gvfsjobqueryattributes.h"
 #include "gvfsjobenumerate.h"
 #include "gvfsdaemonprotocol.h"
+#include "gvfskeyring.h"
 
 #ifdef HAVE_GCONF
 #include <gconf/gconf-client.h>
@@ -75,6 +76,9 @@
   GMountSource *mount_source; /* Only used/set during mount */
   int mount_try;
   gboolean mount_try_again;
+	
+  gboolean password_in_keyring;
+  GPasswordSave password_save;
   
   /* Cache */
   char *cached_server_name;
@@ -177,36 +181,55 @@
     }
   else
     {
-      GAskPasswordFlags flags = G_ASK_PASSWORD_NEED_PASSWORD;
-      char *message;
+      gboolean in_keyring = FALSE;
+
+      if (!backend->password_in_keyring)
+        {
+	  in_keyring = g_vfs_keyring_lookup_password (backend->user,
+						      backend->server,
+						      backend->domain,
+						      "smb",
+						      &ask_user,
+						      &ask_domain,
+						      &ask_password);
+	  backend->password_in_keyring = in_keyring;
+	}
       
-      if (backend->domain == NULL)
-	flags |= G_ASK_PASSWORD_NEED_DOMAIN;
-      if (backend->user == NULL)
-	flags |= G_ASK_PASSWORD_NEED_USERNAME;
-
-      /* translators: First %s is a share name, second is a server name */
-      message = g_strdup_printf (_("Password required for share %s on %s"),
-				 share_name, server_name);
-      handled = g_mount_source_ask_password (backend->mount_source,
-					     message,
-					     username_out,
-					     domain_out,
-					     flags,
-					     &abort,
-					     &ask_password,
-					     &ask_user,
-					     &ask_domain,
-					     NULL);
-      g_free (message);
-      if (!handled)
-	goto out;
+      if (!in_keyring)
+        {
+	  GAskPasswordFlags flags = G_ASK_PASSWORD_NEED_PASSWORD;
+	  char *message;
       
-      if (abort)
-	{
-	  strncpy (username_out, "ABORT", unmaxlen);
-	  strncpy (password_out, "", pwmaxlen);
-	  goto out;
+	  if (g_vfs_keyring_is_available ())
+	    flags |= G_ASK_PASSWORD_SAVING_SUPPORTED;
+	  if (backend->domain == NULL)
+	    flags |= G_ASK_PASSWORD_NEED_DOMAIN;
+	  if (backend->user == NULL)
+	    flags |= G_ASK_PASSWORD_NEED_USERNAME;
+
+	  /* translators: First %s is a share name, second is a server name */
+	  message = g_strdup_printf (_("Password required for share %s on %s"),
+				     share_name, server_name);
+	  handled = g_mount_source_ask_password (backend->mount_source,
+						 message,
+						 username_out,
+						 domain_out,
+						 flags,
+						 &abort,
+						 &ask_password,
+						 &ask_user,
+						 &ask_domain,
+						 &(backend->password_save));
+	  g_free (message);
+	  if (!handled)
+	    goto out;
+      
+	  if (abort)
+	    {
+	      strncpy (username_out, "ABORT", unmaxlen);
+	      strncpy (password_out, "", pwmaxlen);
+	      goto out;
+	    }
 	}
 
       /* Try again if this fails */
@@ -504,6 +527,7 @@
 
   op_backend->mount_source = mount_source;
   op_backend->mount_try = 0;
+  op_backend->password_save = G_PASSWORD_SAVE_NEVER;
 
   do
     {
@@ -533,6 +557,13 @@
 			_("Failed to mount Windows share"));
       return;
     }
+
+  g_vfs_keyring_save_password (op_backend->last_user,
+			       op_backend->server,
+			       op_backend->last_domain,
+			       "smb",
+			       op_backend->last_password,
+			       op_backend->password_save);
   
   g_vfs_job_succeeded (G_VFS_JOB (job));
 }



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