gvfs r1305 - in trunk: . daemon
- From: alexl svn gnome org
- To: svn-commits-list gnome org
- Subject: gvfs r1305 - in trunk: . daemon
- Date: Tue, 19 Feb 2008 13:47:00 +0000 (GMT)
Author: alexl
Date: Tue Feb 19 13:47:00 2008
New Revision: 1305
URL: http://svn.gnome.org/viewvc/gvfs?rev=1305&view=rev
Log:
2008-02-19 Alexander Larsson <alexl redhat com>
* daemon/gvfsbackendsftp.c:
Authentication fixups (#511517)
Patch from Carlos Garcia Campos
Modified:
trunk/ChangeLog
trunk/daemon/gvfsbackendsftp.c
Modified: trunk/daemon/gvfsbackendsftp.c
==============================================================================
--- trunk/daemon/gvfsbackendsftp.c (original)
+++ trunk/daemon/gvfsbackendsftp.c Tue Feb 19 13:47:00 2008
@@ -620,6 +620,7 @@
char *new_password = NULL;
GPasswordSave password_save;
gsize bytes_written;
+ gboolean password_in_keyring = FALSE;
if (op_backend->client_vendor == SFTP_VENDOR_SSH)
prompt_fd = stderr_fd;
@@ -640,34 +641,36 @@
tv.tv_usec = 0;
ret = select (MAX (stdout_fd, prompt_fd)+1, &ifds, NULL, NULL, &tv);
-
+
if (ret <= 0)
- {
- g_set_error (error,
- G_IO_ERROR, G_IO_ERROR_TIMED_OUT,
- "%s", _("Timed out when logging in"));
- ret_val = FALSE;
- break;
- }
+ {
+ g_set_error (error,
+ G_IO_ERROR, G_IO_ERROR_TIMED_OUT,
+ "%s", _("Timed out when logging in"));
+ ret_val = FALSE;
+ break;
+ }
if (FD_ISSET (stdout_fd, &ifds))
- break; /* Got reply to initial INIT request */
-
+ break; /* Got reply to initial INIT request */
+
g_assert (FD_ISSET (prompt_fd, &ifds));
-
-
+
+
len = g_input_stream_read (prompt_stream,
- buffer, sizeof (buffer) - 1,
- NULL, error);
-
+ buffer, sizeof (buffer) - 1,
+ NULL, error);
+
if (len == -1)
- {
- ret_val = FALSE;
- break;
- }
+ {
+ ret_val = FALSE;
+ break;
+ }
buffer[len] = 0;
+ password_save = G_PASSWORD_SAVE_NEVER;
+
/*
* If the input URI contains a username
* if the input URI contains a password, we attempt one login and return GNOME_VFS_ERROR_ACCESS_DENIED on failure.
@@ -687,74 +690,82 @@
* for user and keyring input.
*/
if (g_str_has_suffix (buffer, "password: ") ||
- g_str_has_suffix (buffer, "Password: ") ||
- g_str_has_suffix (buffer, "Password:") ||
- g_str_has_prefix (buffer, "Enter passphrase for key"))
- {
- if (!g_vfs_keyring_lookup_password (op_backend->user,
- op_backend->host,
- NULL,
- "sftp",
- NULL,
- NULL,
- &new_password))
- {
- GAskPasswordFlags flags = G_ASK_PASSWORD_NEED_PASSWORD;
-
- if (g_vfs_keyring_is_available ())
- flags |= G_ASK_PASSWORD_SAVING_SUPPORTED;
-
- if (!g_mount_source_ask_password (mount_source,
- g_str_has_prefix (buffer, "Enter passphrase for key") ?
- _("Enter passphrase for key")
- :
- _("Enter password"),
- op_backend->user,
- NULL,
- flags,
- &aborted,
- &new_password,
- NULL,
- NULL,
- &password_save) ||
- aborted)
- {
- g_set_error (error,
- G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
- "%s", _("Password dialog cancelled"));
- ret_val = FALSE;
- break;
+ g_str_has_suffix (buffer, "Password: ") ||
+ g_str_has_suffix (buffer, "Password:") ||
+ g_str_has_prefix (buffer, "Enter passphrase for key"))
+ {
+ /* If password is in keyring at this point is because it failed */
+ if (password_in_keyring ||
+ !g_vfs_keyring_lookup_password (op_backend->user,
+ op_backend->host,
+ NULL,
+ "sftp",
+ NULL,
+ NULL,
+ &new_password))
+ {
+ GAskPasswordFlags flags = G_ASK_PASSWORD_NEED_PASSWORD;
+
+ if (g_vfs_keyring_is_available ())
+ flags |= G_ASK_PASSWORD_SAVING_SUPPORTED;
+
+ if (!g_mount_source_ask_password (mount_source,
+ g_str_has_prefix (buffer, "Enter passphrase for key") ?
+ _("Enter passphrase for key")
+ :
+ _("Enter password"),
+ op_backend->user,
+ NULL,
+ flags,
+ &aborted,
+ &new_password,
+ NULL,
+ NULL,
+ &password_save) ||
+ aborted)
+ {
+ g_set_error (error,
+ G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
+ "%s", _("Password dialog cancelled"));
+ ret_val = FALSE;
+ break;
+ }
+ }
+ else
+ password_in_keyring = TRUE;
+
+ if (!g_output_stream_write_all (reply_stream,
+ new_password, strlen (new_password),
+ &bytes_written,
+ NULL, NULL) ||
+ !g_output_stream_write_all (reply_stream,
+ "\n", 1,
+ &bytes_written,
+ NULL, NULL))
+ {
+ g_set_error (error,
+ G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
+ "%s", _("Can't send password"));
+ ret_val = FALSE;
+ break;
+ }
}
-
- g_vfs_keyring_save_password (op_backend->user,
- op_backend->host,
- NULL,
- "sftp",
- new_password,
- password_save);
- }
-
- if (!g_output_stream_write_all (reply_stream,
- new_password, strlen (new_password),
- &bytes_written,
- NULL, NULL) ||
- !g_output_stream_write_all (reply_stream,
- "\n", 1,
- &bytes_written,
- NULL, NULL))
- {
- g_set_error (error,
- G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
- "%s", _("Can't send password"));
- ret_val = FALSE;
- break;
- }
- }
else if (g_str_has_prefix (buffer, "The authenticity of host '") ||
- strstr (buffer, "Key fingerprint:") != NULL)
- {
- /* TODO: Handle these messages */
- }
+ strstr (buffer, "Key fingerprint:") != NULL)
+ {
+ /* TODO: Handle these messages */
+ }
+ }
+
+ if (ret_val)
+ {
+ /* Login succeed, save password in keyring */
+ g_vfs_keyring_save_password (op_backend->user,
+ op_backend->host,
+ NULL,
+ "sftp",
+ new_password,
+ password_save);
}
g_object_unref (prompt_stream);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]