wish-ssh-code-review
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseWish SSH Code Review
Wish SSH 代码评审
Quick Reference
快速参考
| Issue Type | Reference |
|---|---|
| Server setup, middleware | references/server.md |
| Session handling, security | references/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
评审问题
- Are host keys handled securely?
- Is middleware order correct?
- Is graceful shutdown implemented?
- Are PTY window sizes passed to the TUI?
- Are connection timeouts configured?
- 主机密钥的处理是否安全?
- 中间件的顺序是否正确?
- 是否实现了优雅关闭机制?
- PTY窗口尺寸是否传递给了TUI?
- 是否配置了连接超时?