Skip to content

Hard lock admin panel with permanent modal when paid license expires #28

Description

@Devsome

Motivation

Currently, after a trial license expires, the silkpanel‑cms backend remains usable – only updates are blocked. For paid licenses (1/3/12‑month plans) we need stronger enforcement. Once a paid license expires, the admin panel must become completely inaccessible. The user should see a permanent modal overlay that cannot be dismissed, effectively locking them out until they renew their license.

This behavior must be shipped as a separate Composer package (silkpanel/license-enforcement) distributed through https://composer.devso.me. The private repository already blocks package downloads when a license is invalid or expired, so the enforcement package itself cannot be updated once the license expires. However, the installed package remains present and continues to enforce the lock, ensuring the admin panel stays blocked.

Proposed solution

  1. License enforcement package
    A new package silkpanel/license-enforcement is created and made available via the private composer repository. It contains:

    • A middleware that runs on all admin routes.
    • A permanent modal component (Filament modal or dedicated overlay).
    • A service that checks the license status, either by caching the latest heartbeat response from devso.me or by calling the license endpoint directly.
  2. Lock logic
    On every admin request, the middleware inspects the current license status:

    • Paid license expired → The response is replaced by a view/modal that covers the entire screen. The modal displays a message (e.g., “Your license has expired. Please renew to regain access.”) and has no close button, no dismiss action, no escape route. All admin URLs return this modal.
    • Trial expired → No hard lock; the existing behavior is kept (backend usable, updates blocked).
    • Active paid license → Normal access.
    • License server unreachable → A grace period (e.g., 7 days) applies; after that, the hard lock is triggered to prevent abuse. The last known valid status is retained locally.

    Important: This logic depends on the license server returning not just valid = true/false, but also additional fields that indicate whether the user has ever been a paying customer. See the required API changes below (sub‑ticket).

  3. Permanent modal implementation
    The modal is rendered as a full‑page overlay, not a simple pop‑up. It must not be closable via keyboard, click, or URL manipulation. The middleware returns this modal for any admin route, including Filament’s root URL and all child paths.

  4. Documentation update
    The official documentation will be revised to clearly explain the difference between trial expiration and paid license expiration. It will describe the lockout screen, how to renew (via devso.me), and that once renewed, the lock is automatically lifted after the next successful license heartbeat.

  5. Package update restriction (by design)
    Because composer.devso.me requires a valid license key to download packages, an expired license prevents the enforcement package from being updated. However, the already installed package continues to function and enforces the lock. This ensures a user cannot simply update to a version without the lock while their license is expired.

Metadata

Metadata

Assignees

Labels

featureNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions