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

  1. Enable the Folders plugin (ensure it is included in the application's loaded plugins and the EE license covers it)
  2. Check config/plugins.php or the plugin loading list that Passbolt/Folders is registered before using folder logs
  3. If Folders should stay disabled, do not expose/use the folder logs endpoints
  4. 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

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


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)