passbolt/passbolt_api · error · FeaturePluginDisabledException
Feature plugin disabled.
Error message
Feature plugin disabled.
What it means
FolderActionLogsFinder::find throws FeaturePluginDisabledException when the Folders feature plugin is not enabled, even though the AuditLog plugin (which provides folder activity logs) is enabled. AuditLog's folder log views depend on the Folders plugin, so requesting folder logs in an organization without Folders active is an unsupported operation.
Solutions
- Enable the Folders plugin (ensure it is included in the application's loaded plugins and the EE license covers it)
- Check config/plugins.php or the plugin loading list that Passbolt/Folders is registered before using folder logs
- If Folders should stay disabled, do not expose/use the folder logs endpoints
- Verify the license/subscription — EE plugins can be auto-disabled on license issues
Example fix
// before (bootstrap)
new PluginCollection(); // Folders omitted
->add(new FoldersPlugin()) // missing
// after
$plugins->add(new AuditLogPlugin())
->add(new FoldersPlugin()); // dependency enabled Defensive patterns
Strategy: try-catch
Validate before calling
const health = await getServerPlugins(); // e.g. via /healthcheck or settings
if (!health.includes('folders')) throw new Error('Folders plugin is disabled on this server'); Type guard
const foldersEnabled = (plugins) => Array.isArray(plugins) && plugins.some(p => p.slug === 'folders' && p.enabled === true);
Try / catch
try {
const logs = await getFolderLogs(folderId);
} catch (e) {
if (e.code === 503 && /feature plugin disabled|unsupported/i.test(e.message ?? '')) {
hideFolderLogsUI();
} else { throw e; }
} Prevention
- Verify the Folders plugin is enabled and licensed before exposing folder log features
- Feature-detect server capabilities instead of assuming EE plugins are active
- Keep AuditLog and Folders plugin enablement consistent across environments
- Check EE license status when plugins appear unexpectedly disabled
When it happens
Trigger: GET /folders/<uuid>/logs.json (or any finder call) on an instance where Passbolt/Folders is disabled in the loaded plugin list — e.g. EE trial expired or Folders removed from the bootstrap plugins.
Common situations: AuditLog EE enabled but Folders EE disabled by configuration/license downgrade; production parity issues between environments; tests (like testFolderActionLogsFinder_Find) running on a fixture app without Folders loaded.
Related errors
- The folder does not exist.
- 500
- A mapping rule for ID attribute could not be found for…
- A mapping rule for username attribute could not be found…
- An error has occurred parsing groupCustomFilter
AI-assisted analysis of passbolt/passbolt_api@31c1bbc10f (2026-09-17).
Data as JSON: /api/errors/db8377f289b78c57.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/PassboltEe/AuditLog/src/Utility/FolderActionLogsFinder.php:105
->union($this->_findActionLogIdsForPermissionsHistoryFolders($folderId));
return $query->join([
'folderActionLogs' => [
'table' => $subQuery,
'alias' => 'folderActionLogs',
'type' => 'INNER',
'conditions' => ['folderActionLogs.ActionLogs__id' => new IdentifierExpression('ActionLogs.id')],
],
]);
}
/**
* @inheritDoc
*/
public function find(UserAccessControl $uac, string $entityId, ?array $options = []): Query
{
if (!$this->isFeaturePluginEnabled(FoldersPlugin::class)) {
throw new FeaturePluginDisabledException();
}
// Check that the folder exists and is accessible.
/** @var \Passbolt\Folders\Model\Table\FoldersTable $Folders */
$Folders = TableRegistry::getTableLocator()->get('Passbolt/Folders.Folders');
$folder = $Folders->findView($uac->getId(), $entityId, $options)->first();
if (empty($folder)) {
throw new NotFoundException('The folder does not exist.');
}
// Build query.
$q = $this->_getBaseQuery();
return $this->_filterQueryByFolderId($q, $entityId);
}
}
View on GitHub (pinned to 31c1bbc10f)