// newSSH2Server constructs a ServerTransport based on HTTP2. ConnectionError is // returned if something goes wrong. func newSSH2Server(conn net.Conn, maxStreams uint32) (_ ServerTransport, err error) { logrus.SetLevel(logrus.DebugLevel) logrus.Debugln("newSSH2Server") keyAuthCallback := func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { logrus.Debugln("newSSH2Server -- user public key: ", hex.EncodeToString(key.Marshal())[:64]+"...") return &ssh.Permissions{}, nil } config := &ssh.ServerConfig{ PublicKeyCallback: keyAuthCallback, } // get or create host key for ssh server appPath, err := osext.Executable() if err != nil { return nil, err } keyPath := filepath.Join(filepath.Dir(appPath), "hostKey.pem") hostKey, err := sshutil.KeyLoader{Path: keyPath, Flags: sshutil.Create + sshutil.Save + sshutil.RSA2048}.Load() if err != nil { return nil, err } config.AddHostKey(hostKey) t := &ssh2Server{ conn: conn, writableChan: make(chan int, 1), channelsByStreamId: make(map[uint32]*ssh.Channel), } t.sshServerConn, t.newChans, t.globalReqs, err = ssh.NewServerConn(conn, config) if err != nil { logrus.Debugln("newSSH2Server -- Failed to hanshake:", err.Error()) return nil, err } else { logrus.Debugln("newSSH2Server -- hanshake OK") } t.writableChan <- 0 return t, nil }