wish-ssh-code-review

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Wish SSH Code Review

Wish SSH 代码评审

Quick Reference

快速参考

Issue TypeReference
Server setup, middlewarereferences/server.md
Session handling, securityreferences/sessions.md
问题类型参考文档
服务器配置、中间件references/server.md
会话处理、安全references/sessions.md

Review Checklist

评审检查清单

  • Host keys are loaded from file or generated securely
  • Middleware order is correct (logging first, auth early)
  • Session context is used for per-connection state
  • Graceful shutdown handles active sessions
  • PTY requests are handled for terminal apps
  • Connection limits prevent resource exhaustion
  • Timeout middleware prevents hung connections
  • BubbleTea middleware correctly configured
  • 主机密钥从文件加载或通过安全方式生成
  • 中间件顺序正确(日志中间件优先,认证中间件靠前)
  • 会话上下文用于存储每个连接的状态
  • 优雅关闭机制可处理活跃会话
  • 为终端应用处理PTY请求
  • 连接限制可防止资源耗尽
  • 超时中间件可防止连接挂起
  • BubbleTea中间件配置正确

Critical Patterns

关键实现模式

Server Setup

服务器配置

go
// GOOD - complete server setup
s, err := wish.NewServer(
    wish.WithAddress(fmt.Sprintf("%s:%d", host, port)),
    wish.WithHostKeyPath(".ssh/id_ed25519"),
    wish.WithMiddleware(
        logging.Middleware(),       // first: log all connections
        activeterm.Middleware(),    // handle terminal sizing
        bubbletea.Middleware(teaHandler),
    ),
)
if err != nil {
    return fmt.Errorf("creating server: %w", err)
}
go
// 规范示例 - 完整的服务器配置
s, err := wish.NewServer(
    wish.WithAddress(fmt.Sprintf("%s:%d", host, port)),
    wish.WithHostKeyPath(".ssh/id_ed25519"),
    wish.WithMiddleware(
        logging.Middleware(),       // 优先:记录所有连接
        activeterm.Middleware(),    // 处理终端尺寸调整
        bubbletea.Middleware(teaHandler),
    ),
)
if err != nil {
    return fmt.Errorf("creating server: %w", err)
}

Graceful Shutdown

优雅关闭

go
// BAD - abrupt shutdown
log.Fatal(s.ListenAndServe())

// GOOD - graceful shutdown
done := make(chan os.Signal, 1)
signal.Notify(done, os.Interrupt, syscall.SIGTERM)

go func() {
    if err := s.ListenAndServe(); err != nil && !errors.Is(err, ssh.ErrServerClosed) {
        log.Error("server error", "error", err)
    }
}()

<-done
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := s.Shutdown(ctx); err != nil {
    log.Error("shutdown error", "error", err)
}
go
// 不规范示例 - 强制关闭
log.Fatal(s.ListenAndServe())

// 规范示例 - 优雅关闭
done := make(chan os.Signal, 1)
signal.Notify(done, os.Interrupt, syscall.SIGTERM)

go func() {
    if err := s.ListenAndServe(); err != nil && !errors.Is(err, ssh.ErrServerClosed) {
        log.Error("server error", "error", err)
    }
}()

<-done
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := s.Shutdown(ctx); err != nil {
    log.Error("shutdown error", "error", err)
}

BubbleTea Handler

BubbleTea 处理器

go
func teaHandler(s ssh.Session) (tea.Model, []tea.ProgramOption) {
    pty, _, _ := s.Pty()

    model := NewModel(pty.Window.Width, pty.Window.Height)

    return model, []tea.ProgramOption{
        tea.WithAltScreen(),
        tea.WithMouseCellMotion(),
    }
}
go
func teaHandler(s ssh.Session) (tea.Model, []tea.ProgramOption) {
    pty, _, _ := s.Pty()

    model := NewModel(pty.Window.Width, pty.Window.Height)

    return model, []tea.ProgramOption{
        tea.WithAltScreen(),
        tea.WithMouseCellMotion(),
    }
}

When to Load References

何时查阅参考文档

  • Reviewing server initialization → server.md
  • Reviewing authentication, session state → sessions.md
  • 评审服务器初始化逻辑 → server.md
  • 评审认证、会话状态逻辑 → sessions.md

Review Questions

评审问题

  1. Are host keys handled securely?
  2. Is middleware order correct?
  3. Is graceful shutdown implemented?
  4. Are PTY window sizes passed to the TUI?
  5. Are connection timeouts configured?
  1. 主机密钥的处理是否安全?
  2. 中间件的顺序是否正确?
  3. 是否实现了优雅关闭机制?
  4. PTY窗口尺寸是否传递给了TUI?
  5. 是否配置了连接超时?