Active
Project:
Subscription Manager
Version:
1.0.x-dev
Component:
Code
Priority:
Normal
Category:
Task
Assigned:
Unassigned
Reporter:
Created:
11 Oct 2026 at 04:43 UTC
Updated:
18 Oct 2026 at 03:49 UTC
Jump to comment: Most recent
Several cheap or anonymous requests fan out into calls to the billing provider with nothing limiting them, from a security review before beta7:
/subscription-manager/subscribe, api/subscribe-url, api/portal-url and the manage route of a hosted-portal connector mints a fresh remote checkout or portal session; SubscriptionRefreshThrottle deliberately leaves these paths alone.A scripted account, or a registration loop, can exhaust a provider's rate limit or quota and litter it with sessions. The module side is confirmed; the cost depends on the connector.
flood service, default 10 per 10 minutes, settings), after which the route returns 429 with a Retry-After header and the API shapes an error. Hosted-portal and checkout sessions are short-lived at the provider, so a bounded count per window loses nothing.Flood settings on the settings form.
The subscribe and portal API routes can return 429. No connector interface changes.
None.
Comments
Comment #2
colanAudit note: the module already declares
subscription_manager.refresh_throttle(SubscriptionRefreshThrottle, cache plus time) in the services file, but nothing insrc/uses it and its docblock describes a route that does not exist. Whatever this issue decides should either build on that class or remove the declaration; the dead-code cleanup issue defers that call here.Comment #3
colanScope addition. Commit e41b3bf on 1.0.x added a
subscription_manager.toolsservice exposing five Tool API tools to AI agents, MCP clients and ECA. Two of them make remote calls on every invocation and belong on this issue's list:subscription_manager.refresh_subscription: onerefreshSubscription()call to the subscription's connector per invocation. Gated by update access on the subscription, so administrators only, but an agent acting for an administrator can loop it.subscription_manager.sync_plans:syncPlans()across one or every connector per invocation. Gated by administer subscription plans.Whatever shape the throttle takes here (the unused
SubscriptionRefreshThrottleservice already declared, or something new), these two entry points should go through it alongside the registration, login, subscribe and portal paths, so an agent cannot drive a connector's rate limit on an administrator's behalf. The three read-only tools (list plans, list a user's subscriptions, list overdue subscriptions) are local queries and need nothing.