Security hardening review fixes#12
Conversation
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughSummary by CodeRabbitRelease Notes
WalkthroughThis PR hardens infrastructure by pinning Docker/CI images to SHA digests, binding the DB port to loopback, generating per-worktree random secrets, and restricting metrics auth to bearer tokens only. It adds bounded server message size validation throughout the protocol layer, introduces inventory purchase and WebSocket upgrade rate limiters with per-user connection caps, adds cursor-based pagination and a hard cap to the block service, filters DM unread counts by messaging permissions, and converts a destructive duplicate-row migration into a safe guard-and-raise pattern. ChangesInfrastructure and secret hardening
Protocol message size limits
Server-side rate limiting, connection caps, and block pagination
Sequence Diagram(s)sequenceDiagram
participant Client
participant handleWebSocketUpgrade
participant wsUpgradeRateLimiter as websocketUpgradeRateLimiter
participant TokenVerification
participant ActiveSockets
Client->>handleWebSocketUpgrade: WS upgrade request
handleWebSocketUpgrade->>wsUpgradeRateLimiter: check(clientIP)
alt IP rate limited
wsUpgradeRateLimiter-->>handleWebSocketUpgrade: exceeded
handleWebSocketUpgrade-->>Client: 429 + retry-after header
else IP allowed
handleWebSocketUpgrade->>TokenVerification: verify bearer token
alt invalid token
TokenVerification-->>handleWebSocketUpgrade: 401
handleWebSocketUpgrade-->>Client: 401 Unauthorised
else valid token → userId
handleWebSocketUpgrade->>wsUpgradeRateLimiter: check(userId)
alt user rate limited
wsUpgradeRateLimiter-->>handleWebSocketUpgrade: exceeded
handleWebSocketUpgrade-->>Client: 429 + retry-after header
else user allowed
handleWebSocketUpgrade->>ActiveSockets: count active sockets for userId
alt count >= maxWebSocketConnectionsPerUser
ActiveSockets-->>handleWebSocketUpgrade: cap exceeded
handleWebSocketUpgrade-->>Client: 429 TOO_MANY_CONNECTIONS
else
handleWebSocketUpgrade-->>Client: 101 Switching Protocols
end
end
end
end
sequenceDiagram
participant WebSocket
participant NetClient
participant parseRawServerMessage
participant serverMessageSchema
WebSocket->>NetClient: raw message (string | Buffer)
NetClient->>parseRawServerMessage: parseRawServerMessage(raw)
parseRawServerMessage->>parseRawServerMessage: byteLength vs MAX_RAW_SERVER_MESSAGE_BYTES
alt oversized
parseRawServerMessage-->>NetClient: {ok: false, "Server message is too large"}
NetClient->>NetClient: emit "received invalid server message" status
else malformed JSON
parseRawServerMessage-->>NetClient: {ok: false, "Malformed server JSON"}
NetClient->>NetClient: emit "received invalid server message" status
else valid
parseRawServerMessage->>serverMessageSchema: parse(json) with SERVER_* bounds
serverMessageSchema-->>parseRawServerMessage: ServerMessage
parseRawServerMessage-->>NetClient: {ok: true, value: ServerMessage}
NetClient->>NetClient: dispatch to onMessage handlers
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary
Verification