feat(auth): block disabled user accounts at the subscription guard

RequireActiveTenantSubscription now optionally takes an AuthRepository
and rejects the request with 40311/user_disabled when the actor's user
row is anything other than active. Wire the repo through the tenant
router, surface the new error code in admin-web's
membershipBlockedErrors set, persist a "disabled" membership status when
markStoredMembershipBlocked sees user_disabled, and add localized copy
on the blocked screen and shell membership banner.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-30 01:31:26 +08:00
parent e15806bd91
commit c9267d2fae
8 changed files with 47 additions and 4 deletions
@@ -102,6 +102,8 @@ const enUS = {
eyebrow: "Access Paused",
title: "This tenant plan is unavailable",
expiredMessage: "Membership expired. Please renew or contact support.",
userDisabledMessage: "User has been disabled. Please contact support.",
reasonUserDisabled: "This user has been disabled. Business pages are now locked. Please contact support to restore access.",
reasonTrialExpired: "The free trial's 3-day page access window has ended. All business pages are now locked. Please contact an administrator to reactivate trial access.",
reasonRequired: "This tenant does not have an active plan. All business pages are now locked. Please contact an administrator.",
reasonInactive: "This tenant plan has expired or been disabled. All business pages are now locked. Please contact an administrator to restore access.",