diff --git a/server/server.go b/server/server.go index 9439d90..759bac9 100644 --- a/server/server.go +++ b/server/server.go @@ -2,9 +2,11 @@ package server import ( "context" + "errors" "fmt" "log" "net" + "time" "tunnel_pls/internal/config" "tunnel_pls/internal/grpc/client" "tunnel_pls/session" @@ -64,30 +66,32 @@ func (s *Server) Start() { func (s *Server) handleConnection(conn net.Conn) { sshConn, chans, forwardingReqs, err := ssh.NewServerConn(conn, s.config) - defer func(sshConn *ssh.ServerConn) { - err = sshConn.Close() - if err != nil { - log.Printf("failed to close SSH server: %v", err) - } - }(sshConn) - if err != nil { log.Printf("failed to establish SSH connection: %v", err) - err := conn.Close() + err = conn.Close() if err != nil { log.Printf("failed to close SSH connection: %v", err) return } return } - ctx := context.Background() - log.Println("SSH connection established:", sshConn.User()) + + defer func(sshConn *ssh.ServerConn) { + err = sshConn.Close() + if err != nil && !errors.Is(err, net.ErrClosed) { + log.Printf("failed to close SSH server: %v", err) + } + }(sshConn) user := "UNAUTHORIZED" if s.grpcClient != nil { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) _, u, _ := s.grpcClient.AuthorizeConn(ctx, sshConn.User()) user = u + cancel() } + + log.Println("SSH connection established:", sshConn.User()) sshSession := session.New(sshConn, forwardingReqs, chans, s.sessionRegistry, user) err = sshSession.Start() if err != nil { diff --git a/session/interaction/interaction.go b/session/interaction/interaction.go index 99723c0..874fbf2 100644 --- a/session/interaction/interaction.go +++ b/session/interaction/interaction.go @@ -672,22 +672,32 @@ func (m *model) View() string { MarginBottom(boxMargin). Width(boxMaxWidth) - urlDisplay := m.getTunnelURL() - if shouldUseCompactLayout(m.width, 80) && len(urlDisplay) > m.width-20 { - maxLen := m.width - 25 - if maxLen > 10 { - urlDisplay = truncateString(urlDisplay, maxLen) - } - } + authenticatedUser := m.interaction.lifecycle.GetUser() + + userInfoStyle := lipgloss.NewStyle(). + Foreground(lipgloss.Color("#FAFAFA")). + Bold(true) + + sectionHeaderStyle := lipgloss.NewStyle(). + Foreground(lipgloss.Color("#888888")). + Bold(true) + + addressStyle := lipgloss.NewStyle(). + Foreground(lipgloss.Color("#FAFAFA")) var infoContent string if shouldUseCompactLayout(m.width, 70) { - infoContent = fmt.Sprintf("🌐 %s", urlBoxStyle.Render(urlDisplay)) - } else if isCompact { - infoContent = fmt.Sprintf("🌐 Forwarding to:\n\n %s", urlBoxStyle.Render(urlDisplay)) + infoContent = fmt.Sprintf("👤 %s\n\n%s\n%s", + userInfoStyle.Render(authenticatedUser), + sectionHeaderStyle.Render("🌐 FORWARDING ADDRESS:"), + addressStyle.Render(fmt.Sprintf(" %s", urlBoxStyle.Render(m.getTunnelURL())))) } else { - infoContent = fmt.Sprintf("🌐 F O R W A R D I N G T O:\n\n %s", urlBoxStyle.Render(urlDisplay)) + infoContent = fmt.Sprintf("👤 Authenticated as: %s\n\n%s\n %s", + userInfoStyle.Render(authenticatedUser), + sectionHeaderStyle.Render("🌐 FORWARDING ADDRESS:"), + addressStyle.Render(urlBoxStyle.Render(m.getTunnelURL()))) } + b.WriteString(responsiveInfoBox.Render(infoContent)) b.WriteString("\n")