com.sshtools.common.configuration.SshToolsConnectionProfile.java Source code

Java tutorial

Introduction

Here is the source code for com.sshtools.common.configuration.SshToolsConnectionProfile.java

Source

//Changes (c) STFC/CCLRC 2006-2007
/*
 *  SSHTools - Java SSH2 API
 *
 *  Copyright (C) 2002 Lee David Painter.
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Library General Public License
 *  as published by the Free Software Foundation; either version 2 of
 *  the License, or (at your option) any later version.
 *
 *  You may also distribute it and/or modify it under the terms of the
 *  Apache style J2SSH Software License. A copy of which should have
 *  been provided with the distribution.
 *
 *  This program 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
 *  License document supplied with your distribution for more details.
 *
 */

package com.sshtools.common.configuration;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import java.awt.Color;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.sshtools.common.util.PropertyUtil;
import com.sshtools.j2ssh.authentication.SshAuthenticationClient;
import com.sshtools.j2ssh.authentication.SshAuthenticationClientFactory;
import com.sshtools.j2ssh.configuration.SshConnectionProperties;
import com.sshtools.j2ssh.forwarding.ForwardingConfiguration;
import com.sshtools.j2ssh.io.IOUtil;
import com.sshtools.j2ssh.transport.AlgorithmNotSupportedException;

/**
 *
 *
 * @author $author$
 * @version $Revision: 1.6 $
 */
public class SshToolsConnectionProfile extends SshConnectionProperties {
    private static Log log = LogFactory.getLog(SshToolsConnectionProfile.class);

    /**  */
    public static final int DO_NOTHING = 1;

    /**  */
    public static final int START_SHELL = 2;

    /**  */
    public static final int EXECUTE_COMMANDS = 3;
    private Map applicationProperties = new HashMap();
    private Map sftpFavorites = new HashMap();
    private Map authMethods = new HashMap();
    private boolean requestPseudoTerminal = true;
    private boolean disconnectOnSessionClose = true;
    private int onceAuthenticated = START_SHELL;
    private String executeCommands = "";
    private boolean allowAgentForwarding = false;

    // SAX Processing variables
    private String currentElement = null;
    private String currentAuthentication = null;
    private Properties currentProperties = null;
    private String connectionFile;

    /**
     * Creates a new SshToolsConnectionProfile object.
     */
    public SshToolsConnectionProfile() {
    }

    /**
     *
     *
     * @return
     */
    public Map getAuthenticationMethods() {
        return authMethods;
    }

    /**
     *
     *
     * @return
     */
    public boolean requiresPseudoTerminal() {
        return requestPseudoTerminal;
    }

    /**
     *
     *
     * @return
     */
    public boolean disconnectOnSessionClose() {
        return disconnectOnSessionClose;
    }

    /**
     *
     *
     * @param requiresPseudoTerminal
     */
    public void setRequiresPseudoTerminal(boolean requiresPseudoTerminal) {
        this.requestPseudoTerminal = requiresPseudoTerminal;
    }

    /**
     *
     *
     * @param disconnectOnSessionClose
     */
    public void setDisconnectOnSessionClose(boolean disconnectOnSessionClose) {
        this.disconnectOnSessionClose = disconnectOnSessionClose;
    }

    /**
     *
     */
    public void clearAuthenticationCache() {
        SshAuthenticationClient auth;
        Properties properties;

        for (Iterator it = authMethods.values().iterator(); it.hasNext();) {
            auth = (SshAuthenticationClient) it.next();

            properties = auth.getPersistableProperties();

            auth.reset();

            auth.setPersistableProperties(properties);
        }
    }

    /**
     *
     *
     * @param onceAuthenticated
     */
    public void setOnceAuthenticatedCommand(int onceAuthenticated) {
        this.onceAuthenticated = onceAuthenticated;
    }

    /**
     *
     *
     * @return
     */
    public int getOnceAuthenticatedCommand() {
        return onceAuthenticated;
    }

    /**
     *
     *
     * @param executeCommands
     */
    public void setCommandsToExecute(String executeCommands) {
        this.executeCommands = executeCommands;
    }

    /**
     *
     *
     * @return
     */
    public String getCommandsToExecute() {
        return executeCommands;
    }

    /**
     *
     *
     * @param name
     * @param defaultValue
     *
     * @return
     */
    public String getApplicationProperty(String name, String defaultValue) {
        String value = (String) applicationProperties.get(name);

        if (value == null) {
            return defaultValue;
        } else {
            return value;
        }
    }

    /**
     *
     *
     * @param name
     * @param defaultValue
     *
     * @return
     */
    public Map getSftpFavorites() {
        return sftpFavorites;
    }

    /**
     *
     *
     * @param name
     * @param defaultValue
     *
     * @return
     */
    public void setSftpFavorite(String name, String value) {
        sftpFavorites.put(name, value);
    }

    /**
     *
     *
     * @param name
     * @param defaultValue
     *
     * @return
     */
    public int getApplicationPropertyInt(String name, int defaultValue) {
        try {
            return Integer.parseInt(getApplicationProperty(name, String.valueOf(defaultValue)));
        } catch (NumberFormatException nfe) {
            return defaultValue;
        }
    }

    /**
     *
     *
     * @param name
     * @param defaultValue
     *
     * @return
     */
    public boolean getApplicationPropertyBoolean(String name, boolean defaultValue) {
        try {
            return new Boolean(getApplicationProperty(name, String.valueOf(defaultValue))).booleanValue();
        } catch (NumberFormatException nfe) {
            return defaultValue;
        }
    }

    /**
     *
     *
     * @param name
     * @param defaultColor
     *
     * @return
     */
    public Color getApplicationPropertyColor(String name, Color defaultColor) {
        return PropertyUtil.stringToColor(getApplicationProperty(name, PropertyUtil.colorToString(defaultColor)));
    }

    /**
     *
     *
     * @param name
     * @param value
     */
    public void setApplicationProperty(String name, String value) {
        applicationProperties.put(name, value);
    }

    /**
     *
     *
     * @param name
     * @param value
     */
    public void setApplicationProperty(String name, int value) {
        applicationProperties.put(name, String.valueOf(value));
    }

    /**
     *
     *
     * @param name
     * @param value
     */
    public void setApplicationProperty(String name, boolean value) {
        applicationProperties.put(name, String.valueOf(value));
    }

    /**
     *
     *
     * @param name
     * @param value
     */
    public void setApplicationProperty(String name, Color value) {
        applicationProperties.put(name, PropertyUtil.colorToString(value));
    }

    /**
     * @return
     */
    public Set getApplicationPropertyKeys() {
        return applicationProperties.keySet();
    }

    /**
     * @return
     */
    public void removeApplicationProperty(String key) {
        applicationProperties.remove(key);
    }

    /**
     *
     *
     * @param method
     */
    public void addAuthenticationMethod(SshAuthenticationClient method) {
        if (method != null) {
            if (!authMethods.containsKey(method.getMethodName())) {
                authMethods.put(method.getMethodName(), method);
            }
        }
    }

    /**
     *
     *
     * @param config
     */
    public void addLocalForwarding(ForwardingConfiguration config) {
        if (config != null) {
            localForwardings.put(config.getName(), config);
        }
    }

    /**
     *
     *
     * @param config
     */
    public void addRemoteForwarding(ForwardingConfiguration config) {
        if (config != null) {
            remoteForwardings.put(config.getName(), config);
        }
    }

    /**
     *
     *
     * @return
     */
    public boolean getAllowAgentForwarding() {
        return allowAgentForwarding;
    }

    /**
     *
     *
     * @param allowAgentForwarding
     */
    public void setAllowAgentForwarding(boolean allowAgentForwarding) {
        this.allowAgentForwarding = allowAgentForwarding;
    }

    /**
     *
     *
     * @param name
     */
    public void removeLocalForwarding(String name) {
        localForwardings.remove(name);
    }

    /**
     *
     *
     * @param name
     */
    public void removeRemoteForwarding(String name) {
        remoteForwardings.remove(name);
    }

    /**
     *
     *
     * @param file
     *
     * @throws InvalidProfileFileException
     */
    public void open(String file) throws InvalidProfileFileException {
        connectionFile = file;
        open(new File(file));
    }

    /**
     *
     *
     * @param file
     *
     * @throws InvalidProfileFileException
     */
    public void open(File file) throws InvalidProfileFileException {
        InputStream in = null;

        try {
            in = new FileInputStream(file);
            open(in);
        } catch (FileNotFoundException fnfe) {
            throw new InvalidProfileFileException(file + " was not found!");
        } finally {
            IOUtil.closeStream(in);
        }
    }

    /**
     *
     *
     * @param in
     *
     * @throws InvalidProfileFileException
     */
    public void open(InputStream in) throws InvalidProfileFileException {
        try {
            SAXParserFactory saxFactory = SAXParserFactory.newInstance();
            SAXParser saxParser = saxFactory.newSAXParser();
            XMLHandler handler = new XMLHandler();
            saxParser.parse(in, handler);
            handler = null;

            //            in.close();
        } catch (IOException ioe) {
            throw new InvalidProfileFileException("IO error. " + ioe.getMessage());
        } catch (SAXException sax) {
            throw new InvalidProfileFileException("SAX Error: " + sax.getMessage());
        } catch (ParserConfigurationException pce) {
            throw new InvalidProfileFileException("SAX Parser Error: " + pce.getMessage());
        } finally {
        }
    }

    /**
     *
     *
     * @param method
     */
    public void removeAuthenticaitonMethod(String method) {
        authMethods.remove(method);
    }

    public void removeAuthenticationMethods() {
        authMethods.clear();
    }

    /**
     *
     *
     * @param file
     *
     * @throws InvalidProfileFileException
     */
    public void save(String file) throws InvalidProfileFileException {
        try {
            File f = new File(file);
            FileOutputStream out = new FileOutputStream(f);
            out.write(toString().getBytes());
            out.close();
        } catch (FileNotFoundException fnfe) {
            throw new InvalidProfileFileException(file + " was not found!");
        } catch (IOException ioe) {
            throw new InvalidProfileFileException("io error on " + file);
        } finally {
        }
    }

    public void save() throws InvalidProfileFileException {
        save(connectionFile);
    }

    /**
     *
     *
     * @return
     */
    public String toString() {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
        xml += ("<SshToolsConnectionProfile Hostname=\"" + host + "\" Port=\"" + String.valueOf(port)
                + "\" Username=\"" + username + "\"" + " Provider=\"" + getTransportProviderString() + "\">");
        xml += ("   <PreferedCipher Client2Server=\"" + prefEncryption + "\" Server2Client=\"" + prefDecryption
                + "\"/>\n");
        xml += ("   <PreferedMac Client2Server=\"" + prefRecvMac + "\" Server2Client=\"" + prefSendMac + "\"/>\n");
        xml += ("   <PreferedCompression Client2Server=\"" + prefRecvComp + "\" Server2Client=\"" + prefSendComp
                + "\"/>\n");
        xml += ("   <PreferedPublicKey Name=\"" + prefPK + "\"/>\n");
        xml += ("   <PreferedKeyExchange Name=\"" + prefKex + "\"/>\n");
        xml += "   <OnceAuthenticated value=\"" + String.valueOf(onceAuthenticated) + "\"/>\n";

        if (onceAuthenticated == EXECUTE_COMMANDS) {
            xml += "    <ExecuteCommands>" + executeCommands + "</ExecuteCommands>\n";
        }

        Iterator it = authMethods.entrySet().iterator();
        Map.Entry entry;
        Properties properties;

        while (it.hasNext()) {
            entry = (Map.Entry) it.next();
            xml += ("   <AuthenticationMethod Name=\"" + entry.getKey() + "\">\n");

            SshAuthenticationClient auth = (SshAuthenticationClient) entry.getValue();
            properties = auth.getPersistableProperties();

            Iterator it2 = properties.entrySet().iterator();

            while (it2.hasNext()) {
                entry = (Map.Entry) it2.next();
                xml += ("      <AuthenticationProperty Name=\"" + entry.getKey() + "\" Value=\"" + entry.getValue()
                        + "\"/>\n");
            }

            xml += "   </AuthenticationMethod>\n";
        }

        it = applicationProperties.entrySet().iterator();

        while (it.hasNext()) {
            entry = (Map.Entry) it.next();
            xml += ("   <ApplicationProperty Name=\"" + entry.getKey() + "\" Value=\"" + entry.getValue()
                    + "\"/>\n");
        }

        // Write the SFTP Favorite entries to file
        it = sftpFavorites.entrySet().iterator();

        while (it.hasNext()) {
            entry = (Map.Entry) it.next();
            xml += ("   <SftpFavorite Name=\"" + entry.getKey() + "\" Value=\"" + entry.getValue() + "\"/>\n");
        }

        it = localForwardings.values().iterator();

        xml += "   <ForwardingAutoStart value=\"" + String.valueOf(forwardingAutoStart) + "\"/>\n";

        while (it.hasNext()) {
            ForwardingConfiguration config = (ForwardingConfiguration) it.next();
            xml += ("   <LocalPortForwarding Name=\"" + config.getName() + "\" AddressToBind=\""
                    + config.getAddressToBind() + "\" PortToBind=\"" + String.valueOf(config.getPortToBind())
                    + "\" AddressToConnect=\"" + config.getHostToConnect() + "\" PortToConnect=\""
                    + String.valueOf(config.getPortToConnect()) + "\"/>\n");
        }

        it = remoteForwardings.values().iterator();

        while (it.hasNext()) {
            ForwardingConfiguration config = (ForwardingConfiguration) it.next();
            xml += ("   <RemotePortForwarding Name=\"" + config.getName() + "\" AddressToBind=\""
                    + config.getAddressToBind() + "\" PortToBind=\"" + String.valueOf(config.getPortToBind())
                    + "\" AddressToConnect=\"" + config.getHostToConnect() + "\" PortToConnect=\""
                    + String.valueOf(config.getPortToConnect()) + "\"/>\n");
        }

        xml += "</SshToolsConnectionProfile>";

        return xml;
    }

    private class XMLHandler extends DefaultHandler {

        boolean commandsToExecute = false;

        public void startElement(String uri, String localName, String qname, Attributes attrs) throws SAXException {
            if (currentElement == null) {
                if (!qname.equals("SshToolsConnectionProfile")) {
                    throw new SAXException("Unexpected root element " + qname);
                }

                host = attrs.getValue("Hostname");
                username = attrs.getValue("Username");

                String p = attrs.getValue("Port");

                if (p == null) {
                    port = 2222;
                } else {
                    port = Integer.parseInt(p);
                }

                setTransportProviderString(attrs.getValue("Provider"));

                if ((host == null) || (username == null)) {
                    throw new SAXException("Required attribute for element <SshToolsConnectionProfile> missing");
                }
            } else {
                String c2s;
                String s2c;

                if (currentElement.equals("SshToolsConnectionProfile")) {
                    if (qname.equals("PreferedCipher")) {
                        c2s = attrs.getValue("Client2Server");
                        s2c = attrs.getValue("Server2Client");

                        if ((c2s == null) || (s2c == null)) {
                            throw new SAXException("Required attribute missing for <PreferedCipher> element");
                        }

                        prefEncryption = c2s;
                        prefDecryption = s2c;
                    } else if (qname.equals("OnceAuthenticated")) {
                        if (attrs.getValue("value") != null) {
                            try {
                                onceAuthenticated = Integer.parseInt(attrs.getValue("value"));
                            } catch (NumberFormatException ex) {
                                onceAuthenticated = START_SHELL;
                            }
                        }
                    } else if (qname.equals("ExecuteCommands")) {
                        commandsToExecute = true;
                        executeCommands = "";
                    } else if (qname.equals("PreferedCompression")) {
                        c2s = attrs.getValue("Client2Server");
                        s2c = attrs.getValue("Server2Client");

                        if ((c2s == null) || (s2c == null)) {
                            throw new SAXException("Required attribute missing for <PreferedCompression> element");
                        }

                        prefRecvComp = c2s;
                        prefSendComp = s2c;
                    } else if (qname.equals("PreferedMac")) {
                        c2s = attrs.getValue("Client2Server");
                        s2c = attrs.getValue("Server2Client");

                        if ((c2s == null) || (s2c == null)) {
                            throw new SAXException("Required attribute missing for <PreferedMac> element");
                        }

                        prefRecvMac = c2s;
                        prefSendMac = s2c;
                    } else if (qname.equals("PreferedPublicKey")) {
                        String name = attrs.getValue("Name");

                        if (name == null) {
                            throw new SAXException("Required attribute missing for <PreferedPublickey> element");
                        }

                        prefPK = name;
                    } else if (qname.equals("PreferedKeyExchange")) {
                        String name = attrs.getValue("Name");

                        if (name == null) {
                            throw new SAXException("Required attribute missing for <PreferedKeyExchange> element");
                        }

                        prefPK = name;
                    } else if (qname.equals("ApplicationProperty")) {
                        String name = attrs.getValue("Name");
                        String value = attrs.getValue("Value");

                        if ((name == null) || (value == null)) {
                            throw new SAXException("Required attributes missing for <ApplicationProperty> element");
                        }

                        applicationProperties.put(name, value);
                    } else if (qname.equals("SftpFavorite")) {
                        String name = attrs.getValue("Name");
                        String value = attrs.getValue("Value");

                        if ((name == null) || (value == null)) {
                            throw new SAXException("Required attributes missing for <SftpFavorite> element");
                        }

                        sftpFavorites.put(name, value);
                    } else if (qname.equals("AuthenticationMethod")) {
                        currentAuthentication = attrs.getValue("Name");
                        currentProperties = new Properties();

                        if (currentAuthentication == null) {
                            throw new SAXException("Required attribute missing for <AuthenticationMethod> element");
                        }
                    } else if (qname.equals("LocalPortForwarding") || qname.equals("RemotePortForwarding")) {
                        String name = attrs.getValue("Name");
                        String addressToBind = attrs.getValue("AddressToBind");
                        String portToBind = attrs.getValue("PortToBind");
                        String addressToConnect = attrs.getValue("AddressToConnect");
                        String portToConnect = attrs.getValue("PortToConnect");

                        if ((name == null) || (addressToBind == null) || (portToBind == null)
                                || (addressToConnect == null) || (portToConnect == null)) {
                            throw new SAXException("Required attribute missing for <" + qname + "> element");
                        }

                        ForwardingConfiguration config = new ForwardingConfiguration(name, addressToBind,
                                Integer.parseInt(portToBind), addressToConnect, Integer.parseInt(portToConnect));

                        if (qname.equals("LocalPortForwarding")) {
                            localForwardings.put(name, config);
                        } else {
                            remoteForwardings.put(name, config);
                        }
                    } else if (qname.equals("ForwardingAutoStart")) {
                        try {
                            forwardingAutoStart = Boolean.valueOf(attrs.getValue("value")).booleanValue();
                        } catch (Throwable ex1) {
                        }
                    } else {
                        throw new SAXException(
                                "Unexpected element <" + qname + "> after SshToolsConnectionProfile");
                    }
                } else if (currentElement.equals("AuthenticationMethod")) {
                    if (qname.equals("AuthenticationProperty")) {
                        String name = attrs.getValue("Name");
                        String value = attrs.getValue("Value");

                        if ((name == null) || (value == null)) {
                            throw new SAXException(
                                    "Required attribute missing for <AuthenticationProperty> element");
                        }

                        currentProperties.setProperty(name, value);
                    } else {
                        throw new SAXException(
                                "Unexpected element <" + qname + "> found after AuthenticationMethod");
                    }
                }
            }

            currentElement = qname;
        }

        public void characters(char[] ch, int pos, int len) {
            executeCommands += new String(ch, pos, len);
        }

        public void endElement(String uri, String localName, String qname) throws SAXException {
            if (currentElement != null) {
                if (!currentElement.equals(qname)) {
                    throw new SAXException("Unexpected end element found " + qname);
                } else if (qname.equals("SshToolsConnectionProfile")) {
                    currentElement = null;
                } else if (qname.startsWith("Prefered")) {
                    currentElement = "SshToolsConnectionProfile";
                } else if (qname.equals("OnceAuthenticated")) {
                    currentElement = "SshToolsConnectionProfile";
                } else if (qname.equals("ExecuteCommands")) {
                    currentElement = "SshToolsConnectionProfile";
                } else if (qname.equals("ApplicationProperty")) {
                    currentElement = "SshToolsConnectionProfile";
                } else if (qname.equals("SftpFavorite")) {
                    currentElement = "SshToolsConnectionProfile";
                } else if (qname.equals("AuthenticationProperty")) {
                    currentElement = "AuthenticationMethod";
                } else if (qname.equals("LocalPortForwarding") || qname.equals("RemotePortForwarding")
                        || qname.equals("ForwardingAutoStart")) {
                    currentElement = "SshToolsConnectionProfile";
                } else if (qname.equals("AuthenticationMethod")) {
                    currentElement = "SshToolsConnectionProfile";

                    try {
                        SshAuthenticationClient auth = SshAuthenticationClientFactory
                                .newInstance(currentAuthentication, SshToolsConnectionProfile.this);
                        auth.setPersistableProperties(currentProperties);
                        authMethods.put(currentAuthentication, auth);
                    } catch (AlgorithmNotSupportedException anse) {
                        log.warn("AuthenticationMethod element ignored because '" + currentAuthentication
                                + "' authentication is not supported");
                    } finally {
                        currentAuthentication = null;
                    }
                } else {
                    throw new SAXException("Unexpected end element <" + qname + "> found");
                }
            }
        }
    }
}