/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * muCommander 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.ui.dialog.server; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.MalformedURLException; import java.text.ParseException; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JSpinner; import javax.swing.JTextField; import com.mucommander.commons.file.Credentials; import com.mucommander.commons.file.FileURL; import com.mucommander.commons.file.protocol.FileProtocols; import com.mucommander.commons.file.protocol.sftp.SFTPFile; import com.mucommander.commons.runtime.OsFamily; import com.mucommander.text.Translator; import com.mucommander.ui.main.MainFrame; /** * This ServerPanel helps initiate SFTP connections. * * @author Maxence Bernard, Vassil Dichev */ public class SFTPPanel extends ServerPanel { private final static int STANDARD_PORT = FileURL.getRegisteredHandler(FileProtocols.SFTP).getStandardPort(); private JTextField serverField; private JTextField privateKeyPathField; private JTextField usernameField; private JPasswordField passwordField; private JTextField initialDirField; private JSpinner portSpinner; private static String lastServer = ""; private static String lastKeyPath = ""; private static String lastUsername = ""; // Not static so that it is not saved (for security reasons) private String lastPassword = ""; private static String lastInitialDir = "/"; private static int lastPort = STANDARD_PORT; SFTPPanel(ServerConnectDialog dialog, final MainFrame mainFrame) { super(dialog, mainFrame); // Server field, initialized to last server entered serverField = new JTextField(lastServer); serverField.selectAll(); addTextFieldListeners(serverField, true); addRow(Translator.get("server_connect_dialog.server"), serverField, 15); // Username field, initialized to last username usernameField = new JTextField(lastUsername); usernameField.selectAll(); addTextFieldListeners(usernameField, false); addRow(Translator.get("server_connect_dialog.username"), usernameField, 5); // Password field, initialized to "" passwordField = new JPasswordField(); addTextFieldListeners(passwordField, false); addRow(Translator.get("password")+"/"+Translator.get("server_connect_dialog.passphrase"), passwordField, 15); // Key file field, initialized to last file JPanel privateKeyChooser = new JPanel(new BorderLayout()); privateKeyPathField = new JTextField(lastKeyPath); privateKeyPathField.selectAll(); addTextFieldListeners(privateKeyPathField, false); privateKeyChooser.add(privateKeyPathField, BorderLayout.CENTER); JButton chooseFileButton = new JButton("..."); // Mac OS X: small component size if(OsFamily.MAC_OS_X.isCurrent()) chooseFileButton.putClientProperty("JComponent.sizeVariant", "small"); chooseFileButton.addActionListener(new ActionListener() { JFileChooser fc = new JFileChooser(System.getProperty("user.home") + System.getProperty("file.separator") + ".ssh"); public void actionPerformed(ActionEvent e) { int returnVal = fc.showOpenDialog(mainFrame); if (returnVal == JFileChooser.APPROVE_OPTION) { privateKeyPathField.setText(fc.getSelectedFile().getAbsolutePath()); } } } ); privateKeyChooser.add(chooseFileButton, BorderLayout.EAST); addRow(Translator.get("server_connect_dialog.private_key"), privateKeyChooser, 15); // Initial directory field, initialized to "/" initialDirField = new JTextField(lastInitialDir); initialDirField.selectAll(); addTextFieldListeners(initialDirField, true); addRow(Translator.get("server_connect_dialog.initial_dir"), initialDirField, 5); // Port field, initialized to last port (default is 22) portSpinner = createPortSpinner(lastPort); addRow(Translator.get("server_connect_dialog.port"), portSpinner, 15); } private void updateValues() { lastKeyPath = privateKeyPathField.getText(); lastServer = serverField.getText(); lastUsername = usernameField.getText(); lastPassword = new String(passwordField.getPassword()); lastInitialDir = initialDirField.getText(); lastPort = (Integer) portSpinner.getValue(); } //////////////////////////////// // ServerPanel implementation // //////////////////////////////// @Override FileURL getServerURL() throws MalformedURLException { updateValues(); if(!lastInitialDir.startsWith("/")) lastInitialDir = "/"+lastInitialDir; FileURL url = FileURL.getFileURL(FileProtocols.SFTP+"://"+lastServer+lastInitialDir); // Set credentials url.setCredentials(new Credentials(lastUsername, lastPassword)); if(!"".equals(lastKeyPath.trim())) url.setProperty(SFTPFile.PRIVATE_KEY_PATH_PROPERTY_NAME, lastKeyPath); // Set port url.setPort(lastPort); return url; } @Override boolean usesCredentials() { return true; } @Override public void dialogValidated() { // Commits the current spinner value in case it was being edited and 'enter' was pressed // (the spinner value would otherwise not be committed) try { portSpinner.commitEdit(); } catch(ParseException e) { } updateValues(); } }