Class SshTestGitServer


  • public class SshTestGitServer
    extends java.lang.Object
    A simple ssh/sftp git test server based on Apache MINA sshd.

    Supports only a single repository. Authenticates only the given test user against his given test public key. Supports fetch and push.

    Since:
    5.2
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private org.apache.sshd.common.util.threads.CloseableExecutorService executorService  
      protected java.util.List<java.security.KeyPair> hostKeys  
      protected Repository repository  
      protected org.apache.sshd.server.SshServer server  
      protected java.security.PublicKey testKey  
      protected java.lang.String testUser  
    • Constructor Summary

      Constructors 
      Constructor Description
      SshTestGitServer​(java.lang.String testUser, java.nio.file.Path testKey, Repository repository, byte[] hostKey)
      Creates a ssh git test server.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void addHostKey​(java.nio.file.Path key, boolean inFront)
      Adds an additional host key to the server.
      void addHostKey​(java.security.KeyPair key, boolean inFront)
      Adds an additional host key to the server.
      protected void configureAuthentication()
      Configures the authentication mechanisms of this test server.
      protected void configureShell()
      Configures shell access for the test server.
      protected java.util.List<org.apache.sshd.server.subsystem.SubsystemFactory> configureSubsystems()
      Configures the test server's subsystems (sftp, scp).
      void enableKeyboardInteractiveAuthentication()
      Enable keyboard-interactive authentication.
      void enablePasswordAuthentication()
      Enable password authentication.
      private java.util.List<org.apache.sshd.server.auth.UserAuthFactory> getAuthFactories()  
      void setPreamble​(java.lang.String... lines)
      Sets the lines the server sends before its server identification in the initial protocol version exchange.
      void setTestUserPublicKey​(java.nio.file.Path key)
      Sets the test user's public key on the server.
      void setTestUserPublicKey​(java.security.PublicKey key)
      Sets the test user's public key on the server.
      int start()
      Starts the test server, listening on a random port.
      void stop()
      Stops the test server.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • testUser

        @NonNull
        protected final java.lang.String testUser
      • hostKeys

        @NonNull
        protected final java.util.List<java.security.KeyPair> hostKeys
      • server

        protected final org.apache.sshd.server.SshServer server
      • testKey

        @NonNull
        protected java.security.PublicKey testKey
      • executorService

        private final org.apache.sshd.common.util.threads.CloseableExecutorService executorService
    • Constructor Detail

      • SshTestGitServer

        public SshTestGitServer​(@NonNull
                                java.lang.String testUser,
                                @NonNull
                                java.nio.file.Path testKey,
                                @NonNull
                                Repository repository,
                                @NonNull
                                byte[] hostKey)
                         throws java.io.IOException,
                                java.security.GeneralSecurityException
        Creates a ssh git test server. It serves one single repository, and accepts public-key authentication for exactly one test user.
        Parameters:
        testUser - user name of the test user
        testKey - private key file of the test user; the server will only user the public key from it
        repository - to serve
        hostKey - the unencrypted private key to use as host key
        Throws:
        java.io.IOException
        java.security.GeneralSecurityException
    • Method Detail

      • getAuthFactories

        private java.util.List<org.apache.sshd.server.auth.UserAuthFactory> getAuthFactories()
      • configureAuthentication

        protected void configureAuthentication()
        Configures the authentication mechanisms of this test server. Invoked from the constructor. The default sets up public key authentication for the test user, and a gssapi-with-mic authenticator that pretends to support this mechanism, but that then refuses to authenticate anyone.
      • configureSubsystems

        @NonNull
        protected java.util.List<org.apache.sshd.server.subsystem.SubsystemFactory> configureSubsystems()
        Configures the test server's subsystems (sftp, scp). Invoked from the constructor. The default provides a simple SFTP setup with the root directory as the given repository's .git directory's parent. (I.e., at the directory containing the .git directory.)
        Returns:
        A possibly empty collection of subsystems.
      • configureShell

        protected void configureShell()
        Configures shell access for the test server. The default provides no shell at all.
      • addHostKey

        public void addHostKey​(@NonNull
                               java.nio.file.Path key,
                               boolean inFront)
                        throws java.io.IOException,
                               java.security.GeneralSecurityException
        Adds an additional host key to the server.
        Parameters:
        key - path to the private key file; should not be encrypted
        inFront - whether to add the new key before other existing keys
        Throws:
        java.io.IOException - if the file denoted by the Path key cannot be read
        java.security.GeneralSecurityException - if the key contained in the file cannot be read
      • addHostKey

        public void addHostKey​(@NonNull
                               java.security.KeyPair key,
                               boolean inFront)
        Adds an additional host key to the server.
        Parameters:
        key - KeyPair to add
        inFront - whether to add the new key before other existing keys
        Since:
        5.8
      • enablePasswordAuthentication

        public void enablePasswordAuthentication()
        Enable password authentication. The server will accept the test user's name, converted to all upper-case, as password.
      • enableKeyboardInteractiveAuthentication

        public void enableKeyboardInteractiveAuthentication()
        Enable keyboard-interactive authentication. The server will accept the test user's name, converted to all upper-case, as password.
      • start

        public int start()
                  throws java.io.IOException
        Starts the test server, listening on a random port.
        Returns:
        the port the server listens on; test clients should connect to that port
        Throws:
        java.io.IOException
      • stop

        public void stop()
                  throws java.io.IOException
        Stops the test server.
        Throws:
        java.io.IOException
      • setTestUserPublicKey

        public void setTestUserPublicKey​(java.nio.file.Path key)
                                  throws java.io.IOException,
                                         java.security.GeneralSecurityException
        Sets the test user's public key on the server.
        Parameters:
        key - to set
        Throws:
        java.io.IOException - if the file cannot be read
        java.security.GeneralSecurityException - if the public key cannot be extracted from the file
      • setTestUserPublicKey

        public void setTestUserPublicKey​(@NonNull
                                         java.security.PublicKey key)
        Sets the test user's public key on the server.
        Parameters:
        key - to set
        Since:
        5.8
      • setPreamble

        public void setPreamble​(java.lang.String... lines)
        Sets the lines the server sends before its server identification in the initial protocol version exchange.
        Parameters:
        lines - to send
        Since:
        5.5