Class OpenSshConfigFile

  • All Implemented Interfaces:
    SshConfigStore

    public class OpenSshConfigFile
    extends Object
    implements SshConfigStore
    Fairly complete configuration parser for the openssh ~/.ssh/config file.

    Both JSch 0.1.54 and Apache MINA sshd 2.1.0 have parsers for this, but both are buggy. Therefore we implement our own parser to read an openssh configuration file.

    Limitations compared to the full openssh 7.5 parser:

    • This parser does not handle Match or Include keywords.
    • This parser does not do host name canonicalization.

    Note that openssh's readconf.c is a validating parser; this parser does not validate entries.

    This config does %-substitutions for the following tokens:

    • %% - single %
    • %C - short-hand for %l%h%p%r.
    • %d - home directory path
    • %h - remote host name
    • %L - local host name without domain
    • %l - FQDN of the local host
    • %n - host name as specified in lookup(String, int, String)
    • %p - port number; if not given in lookup(String, int, String) replaced only if set in the config
    • %r - remote user name; if not given in lookup(String, int, String) replaced only if set in the config
    • %u - local user name

    %i is not handled; Java has no concept of a "user ID". %T is always replaced by NONE.

    See Also:
    man ssh-config
    • Constructor Detail

      • OpenSshConfigFile

        public OpenSshConfigFile​(@NonNull
                                 File home,
                                 @NonNull
                                 File config,
                                 @NonNull
                                 String localUserName)
        Creates a new OpenSshConfigFile that will read the config from file config use the given file home as "home" directory.
        Parameters:
        home - user's home directory for the purpose of ~ replacement
        config - file to load.
        localUserName - user name of the current user on the local host OS
    • Method Detail

      • lookup

        @NonNull
        public OpenSshConfigFile.HostEntry lookup​(@NonNull
                                                  String hostName,
                                                  int port,
                                                  String userName)
        Locate the configuration for a specific host request.
        Specified by:
        lookup in interface SshConfigStore
        Parameters:
        hostName - the name the user has supplied to the SSH tool. This may be a real host name, or it may just be a "Host" block in the configuration file.
        port - the user supplied; <= 0 if none
        userName - the user supplied, may be null or empty if none given
        Returns:
        the configuration for the requested name.
      • validate

        protected String validate​(String key,
                                  String value)
        Hook to perform validation on a single value, or to sanitize it. If this throws an (unchecked) exception, parsing of the file is abandoned.
        Parameters:
        key - of the entry
        value - as read from the config file
        Returns:
        the validated and possibly sanitized value
      • validate

        protected List<String> validate​(String key,
                                        List<String> value)
        Hook to perform validation on values, or to sanitize them. If this throws an (unchecked) exception, parsing of the file is abandoned.
        Parameters:
        key - of the entry
        value - list of arguments as read from the config file
        Returns:
        a List of values, possibly empty and possibly containing empty elements, but not containing null
      • positive

        public static int positive​(String value)
        Converts a positive value into an int.
        Parameters:
        value - to convert
        Returns:
        the value, or -1 if it wasn't a positive integral value
      • flag

        public static boolean flag​(String value)
        Converts a ssh config flag value (yes/true/on - no/false/off) into an boolean.
        Parameters:
        value - to convert
        Returns:
        true if value is "yes", "on", or "true"; false otherwise
      • timeSpec

        public static int timeSpec​(String value)
        Converts an OpenSSH time value into a number of seconds. The format is defined by OpenSSH as a sequence of (positive) integers with suffixes for seconds, minutes, hours, days, and weeks.
        Parameters:
        value - to convert
        Returns:
        the parsed value as a number of seconds, or -1 if the value is not a valid OpenSSH time value
        See Also:
        OpenBSD man 5 sshd_config, section TIME FORMATS
      • getLocalUserName

        public String getLocalUserName()
        Retrieves the local user name as given in the constructor.
        Returns:
        the user name