(server *relayServer)
| 321 | } |
| 322 | |
| 323 | func makeConnection(server *relayServer) http.HandlerFunc { |
| 324 | return func(w http.ResponseWriter, r *http.Request) { |
| 325 | ctx, cancel := context.WithCancel(context.Background()) |
| 326 | defer cancel() |
| 327 | |
| 328 | if server.accessToken != "" { |
| 329 | if r.Header.Get("Authorization") != server.accessToken { |
| 330 | server.sendError(fmt.Errorf("invalid access token")) |
| 331 | return |
| 332 | } |
| 333 | } |
| 334 | |
| 335 | upgrader := websocket.Upgrader{} |
| 336 | c, err := upgrader.Upgrade(w, r, nil) |
| 337 | if err != nil { |
| 338 | server.sendError(fmt.Errorf("error upgrading to websocket: %w", err)) |
| 339 | return |
| 340 | } |
| 341 | defer func() { |
| 342 | if err := c.Close(); err != nil { |
| 343 | server.sendError(fmt.Errorf("error closing websocket: %w", err)) |
| 344 | } |
| 345 | }() |
| 346 | |
| 347 | socketConn := newSocketConn(c) |
| 348 | serverConn, chans, reqs, err := ssh.NewServerConn(socketConn, server.sshConfig) |
| 349 | if err != nil { |
| 350 | server.sendError(fmt.Errorf("error creating ssh server conn: %w", err)) |
| 351 | return |
| 352 | } |
| 353 | |
| 354 | go handleRequests(ctx, convertRequests(reqs)) |
| 355 | |
| 356 | server.serverConn = serverConn |
| 357 | if err := handleChannels(ctx, server, chans); err != nil { |
| 358 | server.sendError(fmt.Errorf("error handling channels: %w", err)) |
| 359 | return |
| 360 | } |
| 361 | } |
| 362 | } |
| 363 | |
| 364 | func (sr *sshRequest) Type() string { |
| 365 | return sr.request.Type |
no test coverage detected