Repository navigation
fix(plugin-sharing): an email-audience share link's refusal does the same work whatever email and password are presented - #23506
Conversation
…same work whatever email and password are presented The refusal of an email-audience share link no longer does a different amount of work depending on the caller's input, as its answer bytes already did not. Pinned by counting the refusal's work per request for an off-list and an allowlisted email. Answer bytes unchanged. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LxHPTb1LxL7a6WkQbALKnD
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 9 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 41602f6338bfd03374790b3565b909b3fa5b9ee5 && git checkout 41602f6338bfd03374790b3565b909b3fa5b9ee5
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 111b5821ce386b88729402861f06bc8a68e4be00 0088cf196f3144a3f1b89b53f015a62d7e10498b && git checkout -B drift-repro 111b5821ce386b88729402861f06bc8a68e4be00 && git merge --no-ff 0088cf196f3144a3f1b89b53f015a62d7e10498b
node scripts/docs-audit/affected-docs.mjs --json 111b5821ce386b88729402861f06bc8a68e4be00 |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 38589026391 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Queue kick: infrastructure, re-queued once ·
|
Fixes #23474
Clause-②: no
Summary
An
email-audience share link's refusal now does the same work whatever email and password are presented, as its answer bytes already did after PR #23471 (#23372). A reachability measurement on both resolve mounts found the difference observable before this change and within noise after it; the full readings are held by the owning seat under this lane's disclosure rule.The change
packages/plugins/plugin-sharing/src/share-link-service.ts,resolveToken: for a live row whose audience isemail, the audience verdict and the password verdict are combined at the end, so the refusal path is the same whatever the caller presents. The legacy-hash upgrade stays on the fully-passed path only. This is the landing point the card named, the gate both resolve mounts share, so no other package changes.Scope
packages/runtime/src/domains/share-links-refusal-order.test.ts) passes untouched, 60 of 60.emailaudience. Thesigned_inearly return is kept. It reveals only whether the caller is signed in, which the caller already knows, so it says nothing about a server-side secret. No reason to widen the change was measured.Tests
Local verification at
0088cf19:packages/plugins/plugin-sharing/src/share-link-service.email-refusal-cost.pin.test.ts. On anemail+password link it counts the refusal's work per request, for an off-list and an allowlisted email, once with a wrong password and once with none: the counts must be equal. Timing is flaky in CI, the counts are not. A control checks that an allowlisted email with the correct password still serves the record.resolveToken(2 of 3 failed, the control passed) and is green after the fix.0088cf19, run throughscripts/ablation-replace.mjs: putting the pre-fix ordering back turns both pair tests red on unequal work counts; the file is then restored, its blob equals HEAD andgit diff HEADis empty.@objectstack/plugin-sharing:test46 files / 1061 tests passed;typecheckexit 0, and the new pin is in the test-layer program.@objectstack/runtime:share-links-refusal-order.test.ts60 / 60, against a rebuilt plugin-sharingdist.dispatch-gates.mjs --commandsderives at0088cf19, every one exit 0;--ranreconciliation: 65 derived, 65 run, 0 NOT-MEASURED. The full farm is CI's.The branch is based at
87315102. The four commitsmainhas gained since touch none of the paths here.Generated by Claude Code