fix(review): harden the E2E-gap fixes after security/regression review
Addresses findings from an independent review of the gap-closing commits: - R1 (regression): add #[serde(default)] to HttpDispatchPayload.method so async-HTTP outbox rows enqueued before the field existed still decode after upgrade instead of dead-lettering on "missing field `method`". Adds a regression test for the missing-key path. - method case: uppercase ctx.request.method at the orchestrator boundary so it honors its documented "uppercased" contract for extension verbs. Route matching is already case-insensitive, so matching is unaffected. - CLI hardening: percent-encode free-form path segments (app slug, topic name, ids, secret name) in the reqwest client so a value containing `/ ? #` can't break out of its URL segment. Adds a `seg()` helper + unit test and applies it uniformly across all path-interpolating methods (new and pre-existing). - S1 (docs): correct the users::email_available enumeration framing — it adds no new vector vs. create's uniqueness error, but is cheaper and unthrottled; there is no built-in throttle/CAPTCHA primitive, so the honest mitigation is a kv-based counter. Updated SDK doc-comments, trait docs, and stdlib-reference. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -207,6 +207,13 @@ pub trait UsersService: Send + Sync {
|
||||
/// this leaks only a single boolean — no id, profile, or timing
|
||||
/// distinction beyond "exists / doesn't" — so a public registration
|
||||
/// script can pre-check before calling `create`.
|
||||
///
|
||||
/// Enumeration note: that bit is the same one a register form already
|
||||
/// leaks ("email taken"), but this probe is cheaper (no password hash),
|
||||
/// has no side effect (a `create` miss writes a junk row), and is not
|
||||
/// rate limited (there is no built-in throttle/CAPTCHA primitive). A
|
||||
/// script exposing it on an anonymous route inherits account-enumeration
|
||||
/// risk and must add its own `kv`-based throttle if that matters.
|
||||
async fn email_available(&self, cx: &SdkCallCx, email: &str) -> Result<bool, UsersError>;
|
||||
|
||||
async fn update(
|
||||
|
||||
Reference in New Issue
Block a user