You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* refactor(sms): rename @objectstack/plugin-sms to @objectstack/service-sms
Infrastructure services follow the service-* convention (service-messaging,
service-settings, ...) - the plugin-* prefix was a misfit for a package whose
whole job is registering the `sms` kernel service (plugin-email is legacy
debt, not precedent). Same exports, same SmsServicePlugin class, same `sms`
service id and settings namespace - only the package name and its home
(packages/services/service-sms) change. The one published
@objectstack/plugin-sms@14.3.0 release should be npm-deprecated in favour of
@objectstack/service-sms.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013LXUXU66dBaP3SSG4ZVtuH
* feat(cli): OS_AUTH_PHONE_NUMBER_ENABLED switch for the phoneNumber plugin
plugins.phoneNumber existed in AuthPluginConfig (#2766) but `objectstack
serve` never set it - there was no way to turn phone sign-in/OTP on from
the CLI. Follows the OS_{DOMAIN}_{FEATURE}_ENABLED convention; default off.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013LXUXU66dBaP3SSG4ZVtuH
* fix(auth): move the OTP send guard to hooks.before (admission control)
Found dogfooding the live flow: better-auth's /phone-number/send-otp stores
the fresh code BEFORE invoking sendOTP, so a cooldown rejection thrown from
the callback still rotated - and thereby invalidated - the previously
delivered code. A user hitting resend during the cooldown (or an attacker
spamming the endpoint) voided the valid OTP every time.
The per-number cooldown/hourly-cap check now runs in the hooks.before
middleware (assertPhoneOtpSendAllowed) for /phone-number/send-otp and
/phone-number/request-password-reset - rejected requests never reach the
endpoint handler, so the stored code survives. The sendOTP callback only
delivers. Behaviour verified end-to-end against a live server.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013LXUXU66dBaP3SSG4ZVtuH
---------
Co-authored-by: Claude <noreply@anthropic.com>
0 commit comments