Plugin Permission System
The XyPriss Plugin System now includes a robust permission model that allows developers to strictly control which actions (hooks) a plugin is allowed to execute. This enhances security by ensuring that plugins only have access to the lifecycle events and features they explicitly require.
Overview
By default, plugins may be allowed to execute any hook. However, you can configure pluginPermissions in your server options to enforce a whitelist of allowed hooks for specific plugins. If a plugin attempts to execute a hook that is not in its allowed list, the action is blocked, and an error is logged.
Configuration
To configure permissions, add the pluginPermissions array to your ServerOptions when initializing the server.
Example Configuration
import { createServer, PluginHookIds } from "xypriss";
const app = await createServer({
// ... other options
pluginPermissions: [
{
name: "my-secure-plugin",
allowedHooks: [
PluginHookIds.ON_SERVER_START,
PluginHookIds.ON_REQUEST,
// Add other allowed hooks here
],
// Optional: 'allow' (default) or 'deny'
policy: "allow",
},
{
name: "untrusted-plugin",
allowedHooks: [], // No hooks allowed
},
],
});
Options
- name: The name of the plugin as defined in its
nameproperty. - allowedHooks: An array of
PluginHookIdsstrings, or"*"to allow all hooks. - policy: (Optional)
"allow"or"deny". Defaults to"allow".- If
policyis"deny", theallowedHookslist acts as a whitelist (only these are allowed). - If
policyis"allow", theallowedHookslist acts as a whitelist if specified.
- If
Available Hook IDs
We provide standardized constants for all plugin hooks to avoid typos and ensure consistency. These are available via PluginHookIds.
Lifecycle Hooks
PluginHookIds.ON_REGISTER(PLG.LIFECYCLE.REGISTER): Called when the plugin is registered.PluginHookIds.ON_SERVER_START(PLG.LIFECYCLE.SERVER_START): Called when the server starts.PluginHookIds.ON_SERVER_READY(PLG.LIFECYCLE.SERVER_READY): Called when the server is fully ready (listening).PluginHookIds.ON_SERVER_STOP(PLG.LIFECYCLE.SERVER_STOP): Called when the server stops.
HTTP Request/Response Hooks
PluginHookIds.ON_REQUEST(PLG.HTTP.ON_REQUEST): Executed on every incoming request.PluginHookIds.ON_RESPONSE(PLG.HTTP.ON_RESPONSE): Executed when a response is finished.PluginHookIds.ON_ERROR(PLG.HTTP.ON_ERROR): Executed when an error occurs in a route.PluginHookIds.MIDDLEWARE(PLG.HTTP.MIDDLEWARE): Permission to register custom middleware.
Security Hooks
PluginHookIds.ON_SECURITY_ATTACK(PLG.SECURITY.ATTACK_DETECTED): Triggered when a security threat is detected.PluginHookIds.ON_RATE_LIMIT(PLG.SECURITY.RATE_LIMIT): Triggered when a rate limit is exceeded.
Metrics & Monitoring Hooks
PluginHookIds.ON_RESPONSE_TIME(PLG.METRICS.RESPONSE_TIME): Receives response time metrics.PluginHookIds.ON_ROUTE_ERROR(PLG.METRICS.ROUTE_ERROR): Receives route error metrics.
Logging Hooks
PluginHookIds.ON_CONSOLE_INTERCEPT(PLG.LOGGING.CONSOLE_INTERCEPT): Privileged Hook. Allows interception of all server and application console output. Disabled by default.
Routing
PluginHookIds.REGISTER_ROUTES(PLG.ROUTING.REGISTER_ROUTES): Permission to register new routes.
Advanced Permission Features
Sticky Denied Hooks
In addition to allowedHooks, XyPriss supports deniedHooks. These are "sticky" permissions that explicitly block a hook, regardless of any other allow rules (including the * wildcard).
- Priority:
deniedHooksalways take precedence overallowedHooks. - Persistence: Once a hook is added to
deniedHooksin the static configuration, it explicitly overrides any attempts to execute that hook.
Enforcement and Stability
The permission system is integrated directly into the PluginManager execution pipeline.
- Pre-execution Check: Before any hook is executed, the system verifies the plugin's effective permissions.
- Denial Handling: If a hook is denied: - The execution is skipped for that specific plugin. - A
logger.erroris issued with details about the blocked attempt. - The server does not crash. The rest of the hook chain and the request lifecycle continue normally.
Configuration-Driven Permissions
Permissions in XyPriss are primarily driven by the static configuration provided during server initialization. This ensures a predictable and secure environment where plugin capabilities are defined at startup.