static gboolean sftpfs_open_connection_ssh_password (struct vfs_s_super *super, GError ** error) { sftpfs_super_data_t *super_data; char *p, *passwd; gboolean ret_value = FALSE; int rc; super_data = (sftpfs_super_data_t *) super->data; if ((super_data->auth_type & PASSWORD) == 0) return FALSE; if (super->path_element->password != NULL) { while ((rc = libssh2_userauth_password (super_data->session, super->path_element->user, super->path_element->password)) == LIBSSH2_ERROR_EAGAIN); if (rc == 0) return TRUE; } p = g_strdup_printf (_("sftp: Enter password for %s "), super->path_element->user); passwd = vfs_get_password (p); g_free (p); if (passwd == NULL) g_set_error (error, MC_ERROR, -1, _("sftp: Password is empty.")); else { while ((rc = libssh2_userauth_password (super_data->session, super->path_element->user, passwd)) == LIBSSH2_ERROR_EAGAIN) ; if (rc == 0) { ret_value = TRUE; g_free (super->path_element->password); super->path_element->password = passwd; } else g_free (passwd); } return ret_value; }
static gboolean sftpfs_open_connection_ssh_key (struct vfs_s_super *super, GError ** error) { sftpfs_super_data_t *super_data; char *p, *passwd; gboolean ret_value = FALSE; super_data = (sftpfs_super_data_t *) super->data; if ((super_data->auth_type & PUBKEY) == 0) return FALSE; if (super_data->privkey == NULL) return FALSE; if (libssh2_userauth_publickey_fromfile (super_data->session, super->path_element->user, super_data->pubkey, super_data->privkey, super->path_element->password) == 0) return TRUE; p = g_strdup_printf (_("sftp: Enter passphrase for %s "), super->path_element->user); passwd = vfs_get_password (p); g_free (p); if (passwd == NULL) g_set_error (error, MC_ERROR, -1, _("sftp: Passphrase is empty.")); else { ret_value = (libssh2_userauth_publickey_fromfile (super_data->session, super->path_element->user, super_data->pubkey, super_data->privkey, passwd) == 0); g_free (passwd); } return ret_value; }
static int fish_open_archive_int (struct vfs_class *me, struct vfs_s_super *super) { { const char *argv[10]; const int port_num = SUP.flags & 0xFFFF; const int sh_flags = SUP.flags & ~0xFFFF; const char *xsh = (sh_flags == FISH_FLAG_RSH ? "rsh" : "ssh"); char buf[8]; int i = 0; argv[i++] = xsh; if (sh_flags == FISH_FLAG_COMPRESSED) argv[i++] = "-C"; if (port_num) { sprintf(buf, "%d", port_num); argv[i++] = "-p"; argv[i++] = buf; } argv[i++] = "-l"; argv[i++] = SUP.user; argv[i++] = SUP.host; argv[i++] = "echo FISH:; /bin/sh"; argv[i++] = NULL; fish_pipeopen (super, xsh, argv); } { char answer[2048]; print_vfs_message (_("fish: Waiting for initial line...")); if (!vfs_s_get_line (me, SUP.sockr, answer, sizeof (answer), ':')) ERRNOR (E_PROTO, -1); print_vfs_message ("%s", answer); if (strstr (answer, "assword")) { /* Currently, this does not work. ssh reads passwords from /dev/tty, not from stdin :-(. */ message (1, MSG_ERROR, _ ("Sorry, we cannot do password authenticated connections for now.")); ERRNOR (EPERM, -1); if (!SUP.password) { char *p, *op; p = g_strconcat (_(" fish: Password required for "), SUP.user, " ", (char *) NULL); op = vfs_get_password (p); g_free (p); if (op == NULL) ERRNOR (EPERM, -1); SUP.password = op; } print_vfs_message (_("fish: Sending password...")); write (SUP.sockw, SUP.password, strlen (SUP.password)); write (SUP.sockw, "\n", 1); } } print_vfs_message (_("fish: Sending initial line...")); /* * Run `start_fish_server'. If it doesn't exist - no problem, * we'll talk directly to the shell. */ if (fish_command (me, super, WAIT_REPLY, "#FISH\necho; start_fish_server 2>&1; echo '### 200'\n") != COMPLETE) ERRNOR (E_PROTO, -1); print_vfs_message (_("fish: Handshaking version...")); if (fish_command (me, super, WAIT_REPLY, "#VER 0.0.0\necho '### 000'\n") != COMPLETE) ERRNOR (E_PROTO, -1); /* Set up remote locale to C, otherwise dates cannot be recognized */ if (fish_command (me, super, WAIT_REPLY, "LANG=C; LC_ALL=C; LC_TIME=C\n" "export LANG; export LC_ALL; export LC_TIME\n" "echo '### 200'\n") != COMPLETE) ERRNOR (E_PROTO, -1); print_vfs_message (_("fish: Setting up current directory...")); SUP.cwdir = fish_getcwd (me, super); print_vfs_message (_("fish: Connected, home %s."), SUP.cwdir); #if 0 super->name = g_strconcat ("/#sh:", SUP.user, "@", SUP.host, "/", (char *) NULL); #endif super->name = g_strdup (PATH_SEP_STR); super->root = vfs_s_new_inode (me, super, vfs_s_default_stat (me, S_IFDIR | 0755)); return 0; }