Exemplo n.º 1
0
// 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
}