Repository navigation
Conversation
Co-Authored-By: Claude Opus 5.5 <[email protected]>
🤖 CI report✅ Trunk lane — non-backend laneThis PR is assigned to the non-backend lane. It does not run backend Python tests and may merge in parallel with PRs in other lanes. ✅ Duplication (Python) — cleanNew Python code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying. ✅ Duplication (TypeScript) — cleanNew TypeScript code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.
|
| File | Comment lines | Added lines |
|---|---|---|
nodejs/src/cdp/services/hogflows/transactional-sends.ts |
17 | 241 |
This check does not block merging. It updates on every push and clears when the share drops.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ransactional-sends
…ransactional-sends # Conflicts: # nodejs/src/cdp/cdp-api.ts
|
Risk: Low · 1 low The change since the last review is a one-line lint cleanup in the new TransactionalSends module: the unused Sentinel reviewed |
…ransactional-sends # Conflicts: # nodejs/src/cdp/cdp-api.ts # nodejs/src/cdp/services/hogflows/transactional-email.ts
…ransactional-sends # Conflicts: # nodejs/src/cdp/cdp-api.ts
| } | ||
| if (files.length) { | ||
| stages.start('files') | ||
| await this.deps.emailAttachments.store(invocation.id, team.id, files) |
There was a problem hiding this comment.
Trailing dot or space in an attachment filename bypasses the blocked-extension list
A customer can attach an executable to a transactional email by ending the filename with a dot or a space: invoice.exe. or invoice.exe passes the blocked-extension check, and Windows strips trailing dots and spaces when the recipient saves the file, leaving a runnable .exe. The new module's store call at transactional-sends.ts:127 passes these files straight into the send pipeline.
How:
- In the attachment filename check (
transactional-email.ts:153-159),name.lastIndexOf('.')oninvoice.exe.finds the trailing dot andname.slice(dot + 1)yields'', which is not inBLOCKED_ATTACHMENT_EXTENSIONS— the suite otherwise expectssetup.EXEto be rejected. - A trailing space works too:
CONTROL_CHARACTER_RE(transactional-email.ts:141) covers\x00-\x1F\x7Fbut not 0x20, soinvoice.exeslices to'exe 'and passes. - The file is stored and delivered to the recipient under that name; SES's own executable filter may not strip trailing dots/spaces the way Windows does.
Fix: strip (or reject) trailing . and space characters from the filename before taking the extension, or reject filenames that end in either.
React with 👍 if useful or 👎 if not
There was a problem hiding this comment.
Valid, but the filename check comes from master and this PR leaves it unchanged. It gets its own fix outside this stack.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Problem
Merge first: #128868.
Warning
🟡 Merge risk: medium · two-way door (merge-risk rubric)
git revertthe merge commit.Landing: #129915 merges alone and its migration runs in US and EU first. #127745 merges next. Then one
/trunk mergeon #128929 lands N1 to N4.Changes
TransactionalSends.acceptowns the send: idempotency, refusal checks, run row, queue insert and status row.flowchart LR subgraph Before R1[send route: auth, parse, load, accept, answer] end subgraph After R2[send route: auth, parse, load, answer] --> T2[transactional sends: accept] end classDef phBlue fill:#1d4aff,stroke:#1d4aff,color:#fff; classDef phGray fill:#e5e7eb,stroke:#c7ccd1,color:#000; class T2 phBlue; class R1,R2 phGray;How did you test this code?
cdp-api.serial.test.tspasses unchanged.Shadow run
reserve,markQueuedandreleasecall with its fingerprint, the status and result rows sent to Kafka, and the outcome and stage counters.fa5a21fagainst N1's head0b6fb84.Release status
Docs update
🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Agent: Claude Code, Claude Opus 5.5
Skills:
/writing-pr-descriptionsMore context for AI agents
scheduled_atand the time rules insideaccept.nodejs/src/cdp/services/hogflows/transactional-sends.tsagainst the removed handler code.🤖 Generated with Claude Code