Skip to content

feature: process external plugin security audit - #840

Open
mbritense wants to merge 5 commits into
feature/external-plugin-systemfrom
fix/external-plugin-audit
Open

feature: process external plugin security audit#840
mbritense wants to merge 5 commits into
feature/external-plugin-systemfrom
fix/external-plugin-audit

Conversation

@mbritense

@mbritense mbritense commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Includes changes from #830.

Closes generiekzaakafhandelcomponent/gzac-issues#821

Hardening & fixes for the external plugin system

Follow-up to story/771-plugin-value-resolvers, addressing the findings of a full audit of the
external plugin/app system (backend external-plugin module, Node.js plugin host + SDK, and the
Angular integration).

Security — token & proxy paths

  • The iframe proxy resolves plugin-supplied paths against window.location.origin and hard-requires same-origin plus the API base-path prefix before attaching the downscoped user token. An empty endpoint allowlist means deny-all, and bundleUrl must be http(s) before it is trusted.
  • The plugin host's public /data route requires an existing configuration with the admin-granted frontend_data capability and a valid user token, introspected against GZAC via a new GET /api/v1/external-plugin/user-token/introspect endpoint and bound to the exact configuration. Fail-closed (401/403/503), with a 60s positive cache and a per-configuration rate limit — no anonymous Wasm execution remains.
  • GET configuration/{id} no longer returns decrypted x-secret properties: secrets are masked on read, and absent secret fields on update keep the stored ciphertext. RabbitMQ credentials are redacted (amqp://***@…) in all host REST responses.
  • Plugins cannot override the host-injected Authorization header in gzac_api, and the host enforces the granted-endpoint allowlist on every gzac_api call — GZAC sends grantedEndpoints in each config push so that enforcement is active.
  • New authenticated host-origins endpoint feeds CSP construction at bootstrap, so non-admin users no longer get CSP-blocked iframes (previously sourced from an ADMIN-only endpoint). The user-token mint response carries the granted endpoints, which all three surfaces feed into the iframe allowlist.
  • Service and user token signing keys are domain-separated (SHA-256(secret|"service") vs SHA-256(secret|"user")) instead of one shared key distinguished only by a claim.

Security — grants, denylist & host hardening

  • Grant validation is strict equality across all three grant types: a configuration only saves when granted endpoints, event subscriptions, and capabilities each exactly match the manifest — nothing less, nothing more — with clear "Missing"/"Not declared" errors.
  • A runtime hard denylist blocks plugin tokens from role/permission management, external-plugin management, and token-minting endpoints regardless of grants, with one narrow carve-out: user tokens may GET the introspection endpoint.
  • HMAC verification gained an in-memory replay cache rejecting duplicate signatures on side-effecting methods; README replay-protection claims were corrected to match.
  • Zip uploads are extracted per-entry with path-containment checks and a file allowlist (closes zip-slip); the pre-auth upload buffer cap dropped from 100 MB to 25 MB.
  • The frontend SDK pins the parent origin from the first validated init (or an explicit parentOrigin option) and queues data-bearing messages instead of posting to "*"; messages from other origins are ignored.

Stability & correctness

  • Wasm execution has a configurable timeout and memory cap; timed-out instances are dropped and recreated, idle instances are evicted, and unload/delete goes through the per-plugin execution lock — a looping plugin can no longer wedge its worker. The gzac_api callback fetch also has a timeout.
  • The GZAC→host RestTemplate has connect/read timeouts, and all host HTTP I/O moved outside database transactions (after-commit pushes, short per-host discovery transactions) — a hung host can no longer exhaust the connection pool or job-executor threads.
  • Host 5xx/connection errors flow into the designed actionFailed/hook-rejection paths (unreachable host → clear 503) instead of raw 500s; silently swallowed push/delete failures are logged.
  • The discovery job runs under @SchedulerLock (the job class is open so ShedLock's CGLIB proxy can subclass it), preventing duplicate polling and config re-pushes in multi-node deployments.
  • getCurrentUserTeams() short-circuits for the system account again (regression from giving the system user a username). EXTERNAL_PLUGIN tab contentKeys are validated up front (400 instead of 500/aborted import) via one shared parser with tolerant event listeners, and re-imports publish update events so tab type changes clean up stale side rows instead of falsely blocking configuration deletion.
  • Process-link saves can no longer hang the modal (catchError + stopSaving, JSON-editor fallback on bundle-resolve failures). Token re-minting lives in one shared ExternalPluginSessionService with retry/backoff instead of three silent copies. The menu resolver matches the required Admin item by stable ID (no more duplicate empty Admin groups after a rename), IncludeFunction persists as an enum name instead of an ordinal, and /plugin-pages routes are registered in the gzac/valtimo apps, not just dev.
  • Liquibase: tab_key 156→256 typo, logicalFilePath/xsd alignment, master changelog include order, and ON DELETE CASCADE on the granted-endpoint/event FKs. Note: unreleased changesets were edited in place, so local dev databases need a reset.
  • frontend_data was added to the GZAC ExternalPluginCapability enum (+ en/nl descriptions), so plugins declaring it in their manifest can actually be configured under the strict grant check.

Quality, UX & cleanup

  • Case-detail CSS overrides moved to a dedicated tab--external-plugin class (no longer clips the widgets tab); ::ng-deep scoped to :host. Plugin-management polling shares one 5s stream instead of three independent timers with deep-equal band-aids; the edit-modal subscription leak and stale-title carryover are fixed; the version-mismatch warning interpolates the actual versions.
  • Convention sweep: hardcoded strings → en/nl translation keys, hex colors and raw px → Carbon tokens, ngModel → reactive FormControl, $-prefix naming corrected, drag listeners cleaned up in ngOnDestroy, blocking startup initializers parallelized.
  • Dead code removed: the abandoned third task-form option (unreachable step-service branches, unrendered step, orphaned translation keys), no-op resize plumbing, vestigial accessToken, and StiSpike* test artifacts renamed. Host code deduplicated: generic callExport, shared guardHostCall capability guard, shared abstract token filter, reuse of ProcessDefinitionUsageMetaResolver. The SDK pack tool stamps sdkVersion into manifests, validated on upload.
  • Duplicate/ambiguous endpoint descriptions differentiated ("… (management)"); descriptions added to aws/s3-resource and case-opensearch, and both modules added to the coverage-test classpath. MenuConfiguration gained a payload size limit, a shared singleton constant, and a security-asserting IT. Duplicate @valtimo-plugins/freemarker key removed from release-plugins.json.

Docs & tests

  • The design document moved from plugin-host/scratch/ to plugin-host/docs/ and was fully rewritten to describe the as-built system (strict grants, token introspection, the full /data gate chain); app/README.md, TESTING.md, and the SDK README are aligned.
  • New test coverage on the previously untested security core: the iframe bridge (origin/prefix/allowlist/message filtering/no token in init), session service, menu resolver, discovery service, strict grant validation, introspection resource + allowlist carve-outs, SystemPrincipal behavior, the external-plugin tab service, and host-side timeout/zip-slip/replay/header-strip/allowlist/data-gating paths (~60+ new tests across the stack).

Verification

  • Backend: :backend:external-plugin, :backend:plugin, :backend:case, :backend:keycloak-iam, :backend:admin-settings test suites pass (incl. the MenuConfiguration IT on PostgreSQL).
  • Plugin host: app unit/component 182, SDK 33, Wasm 17, integration 13 — all pass (Node 22); tsc --noEmit clean.
  • Frontend: AOT builds of the dev, gzac, and valtimo apps succeed; @valtimo/plugin and @valtimo/components specs pass.

Known trade-offs (accepted by design)

  • Service tokens bypass PBAC; their reach is exactly the granted allowlist minus the hard denylist, and the strict grant model makes the permissions screen the security review.
  • The HMAC replay cache covers side-effecting methods only (GETs are replayable within the ±5-min window); hosts should always run behind TLS.
  • The /data rate limit and introspection cache are per-replica in-memory; host entities have no optimistic locking (ShedLock covers the practical race).

@mbritense
mbritense requested review from a team as code owners July 22, 2026 12:57
@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 274 files, which is 174 over the limit of 100.

To get a review, narrow the scope:
• coderabbit review --committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: a7434880-6244-483a-8fbc-1a2bee5a13f3

📥 Commits

Reviewing files that changed from the base of the PR and between f196d22 and d8d8cdf.

⛔ Files ignored due to path filters (3)
  • plugin-host/app/package-lock.json is excluded by !**/package-lock.json
  • plugin-host/sample-plugins/case-summary/package-lock.json is excluded by !**/package-lock.json
  • plugin-host/test-fixtures/test-plugin/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (274)
  • backend/admin-settings/src/main/kotlin/com/ritense/adminsettings/domain/MenuConfiguration.kt
  • backend/admin-settings/src/main/kotlin/com/ritense/adminsettings/service/MenuConfigurationService.kt
  • backend/admin-settings/src/test/kotlin/com/ritense/adminsettings/web/rest/MenuConfigurationResourceIT.kt
  • backend/aws/s3-resource/src/main/kotlin/com/ritense/resource/web/rest/S3Resource.kt
  • backend/building-block/src/main/kotlin/com/ritense/buildingblock/service/BuildingBlockPluginDefinitionService.kt
  • backend/building-block/src/test/kotlin/com/ritense/buildingblock/service/BuildingBlockPluginDefinitionServiceTest.kt
  • backend/case-opensearch/src/main/kotlin/com/ritense/document/opensearch/web/DocumentOpenSearchReindexResource.kt
  • backend/case-opensearch/src/main/kotlin/com/ritense/document/opensearch/web/SearchEngineResource.kt
  • backend/case/src/main/kotlin/com/ritense/case/configuration/CaseAutoConfiguration.kt
  • backend/case/src/main/kotlin/com/ritense/case/service/CaseDefinitionImportPreviewService.kt
  • backend/case/src/main/kotlin/com/ritense/case/service/CaseTabImporter.kt
  • backend/case/src/main/kotlin/com/ritense/case/service/CaseTabService.kt
  • backend/case/src/main/kotlin/com/ritense/case/service/exception/InvalidTabContentKeyException.kt
  • backend/case/src/main/kotlin/com/ritense/case/web/rest/CaseDefinitionResource.kt
  • backend/case/src/main/kotlin/com/ritense/case/web/rest/CaseTabManagementResource.kt
  • backend/case/src/main/kotlin/com/ritense/case/web/rest/StartableItemManagementResource.kt
  • backend/case/src/main/kotlin/com/ritense/case/web/rest/TaskListResource.kt
  • backend/case/src/main/kotlin/com/ritense/case/web/rest/dto/PluginConfigurationPreviewDto.kt
  • backend/case/src/main/kotlin/com/ritense/case_/domain/tab/CaseExternalPluginTab.kt
  • backend/case/src/main/kotlin/com/ritense/case_/rest/CaseHeaderWidgetManagementResource.kt
  • backend/case/src/main/kotlin/com/ritense/case_/rest/CaseWidgetTabManagementResource.kt
  • backend/case/src/main/kotlin/com/ritense/case_/service/CaseExternalPluginTabService.kt
  • backend/case/src/test/kotlin/com/ritense/case/service/CaseTabImporterTest.kt
  • backend/case/src/test/kotlin/com/ritense/case/service/CaseTabServiceTest.kt
  • backend/case/src/test/kotlin/com/ritense/case/web/rest/CaseDefinitionResourceTest.kt
  • backend/case/src/test/kotlin/com/ritense/case_/service/CaseExternalPluginTabServiceTest.kt
  • backend/contract/src/main/kotlin/com/ritense/valtimo/contract/importer/ImportPreviewContribution.kt
  • backend/contract/src/main/kotlin/com/ritense/valtimo/contract/plugin/PluginConfigurationMappingResolver.kt
  • backend/core/src/main/resources/config/liquibase/13-28-0/20260504-external-plugin.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/13-32-0-master.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260622-add-case-external-plugin-tab.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260625-create-admin-settings-menu.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260708-external-plugin-host-kind.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260716-external-plugin-granted-capability.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260720-plugin-action-result-mappings.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260720-plugin-configuration-reference-external-plugin-version.xml
  • backend/docker-resources/docker-compose-base-test-mysql.yml
  • backend/docker-resources/docker-compose-base-test-postgresql.yml
  • backend/external-plugin/build.gradle
  • backend/external-plugin/docker-compose-override-mysql.yml
  • backend/external-plugin/docker-compose-override-postgresql.yml
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/autoconfigure/ExternalPluginAutoConfiguration.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/client/ExternalPluginHostClient.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/domain/ExternalPluginCapability.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/domain/ExternalPluginProcessLink.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/domain/ExternalPluginTaskFormProcessLink.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/exception/ExternalPluginNotFoundException.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/preview/ExternalPluginImportPreviewContributor.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/ExternalPluginProcessLinkMapper.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/ExternalPluginServiceTaskStartListener.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormProcessLinkMapper.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormSubmissionService.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkCreateRequestDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkDeployDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkExportResponseDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkResponseDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkUpdateRequestDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginTaskFormProcessLinkExportResponseDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginTaskFormProcessLinkResponseDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/repository/ExternalPluginProcessLinkRepository.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/repository/ExternalPluginTaskFormProcessLinkRepository.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/security/AbstractExternalPluginTokenFilter.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/security/ExternalPluginEndpointAllowlistFilter.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/security/ExternalPluginHmacSigner.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/security/ExternalPluginHttpSecurityConfigurer.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/security/ExternalPluginServiceTokenFilter.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/security/ExternalPluginServiceTokenKeyProvider.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/security/ExternalPluginTokenKeyProvider.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/security/ExternalPluginUserTokenFilter.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/security/ExternalPluginUserTokenKeyProvider.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginConfigurationMappingResolver.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginConfigurationService.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginDefinitionService.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginDiscoveryJob.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginDiscoveryService.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginHostService.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginHostUsageResolver.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/web/rest/ExternalPluginHostOriginsResource.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/web/rest/ExternalPluginManagementResource.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/web/rest/ExternalPluginUserTokenIntrospectionResource.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/web/rest/ExternalPluginUserTokenResource.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/web/rest/dto/HostDto.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/BaseIntegrationTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/TestApplication.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/autoconfigure/DualPluginConfigurationMappingResolverIntTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/autoconfigure/ExternalPluginAutoConfigurationWiringTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/preview/ExternalPluginImportPreviewContributorTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginProcessLinkImportIntTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginProcessLinkMapperTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginProcessLinkTypeDeductionTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginServiceTaskStartListenerTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormProcessLinkActivityHandlerTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormProcessLinkMapperTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormSubmissionServiceTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/security/ExternalPluginEndpointAllowlistFilterTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/service/ExternalPluginConfigurationMappingResolverTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/service/ExternalPluginConfigurationServiceTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/service/ExternalPluginDiscoveryServiceTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/service/ExternalPluginHostServiceTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/service/ExternalPluginHostUsageResolverTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/web/rest/ExternalPluginHostOriginsResourceTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/web/rest/ExternalPluginUserTokenIntrospectionResourceTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/web/rest/ExternalPluginUserTokenResourceTest.kt
  • backend/external-plugin/src/test/resources/config/application-mysql.yml
  • backend/external-plugin/src/test/resources/config/application-postgresql.yml
  • backend/external-plugin/src/test/resources/config/application.yml
  • backend/external-plugin/src/test/resources/config/case/autodeploy/1-0-0/bpmn/external-plugin-import-process.bpmn
  • backend/external-plugin/src/test/resources/config/case/autodeploy/1-0-0/case/definition/autodeploy.case-definition.json
  • backend/keycloak-iam/src/main/java/com/valtimo/keycloak/service/KeycloakUserManagementService.java
  • backend/keycloak-iam/src/test/java/com/valtimo/keycloak/service/KeycloakUserManagementServiceTest.java
  • backend/plugin-valtimo/build.gradle
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/ProcessLinkAutoConfiguration.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/listener/ProcessLinkChangedEventListener.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/mapper/PluginProcessLinkDeployDto.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/mapper/PluginProcessLinkExportResponseDto.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/mapper/PluginProcessLinkMapper.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/repository/ValtimoPluginProcessLinkRepository.kt
  • backend/plugin-valtimo/src/test/kotlin/com/ritense/valtimo/processlink/ProcessLinkAutoConfigurationWiringTest.kt
  • backend/plugin-valtimo/src/test/kotlin/com/ritense/valtimo/processlink/listener/ProcessLinkChangedEventListenerTest.kt
  • backend/plugin-valtimo/src/test/kotlin/com/ritense/valtimo/processlink/mapper/PluginProcessLinkMapperTest.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/configuration/PluginAutoConfiguration.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/domain/PluginActionResultMapping.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/domain/PluginConfigurationReference.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/domain/PluginProcessLink.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/service/PluginActionResultHandler.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/service/PluginActionResultMappingValidator.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/service/PluginService.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/web/rest/request/PluginProcessLinkCreateDto.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/web/rest/request/PluginProcessLinkUpdateDto.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/web/rest/result/PluginDefinitionsWithDependenciesDto.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/web/rest/result/PluginProcessLinkResultDto.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/domain/ExternalPluginProcessLinkStandIn.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/domain/PluginConfigurationReferenceSharedStiColumnsTest.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/domain/PluginConfigurationReferenceTest.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/service/PluginActionResultHandlerTest.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/service/PluginServiceTest.kt
  • backend/process-link/src/main/kotlin/com/ritense/processlink/importer/ProcessLinkImporter.kt
  • backend/process-link/src/main/kotlin/com/ritense/processlink/mapper/ProcessLinkMapper.kt
  • backend/process-link/src/test/kotlin/com/ritense/processlink/importer/ProcessLinkImporterTest.kt
  • backend/process-link/src/test/kotlin/com/ritense/processlink/mapper/RemapConfigurationIdFieldTest.kt
  • frontend/apps/gzac/src/app/app.module.ts
  • frontend/apps/valtimo/src/app/app.module.ts
  • frontend/projects/valtimo/admin-settings/src/lib/components/admin-settings-menu-configuration/admin-settings-menu-configuration.component.html
  • frontend/projects/valtimo/admin-settings/src/lib/components/admin-settings-menu-configuration/admin-settings-menu-configuration.component.ts
  • frontend/projects/valtimo/bootstrap/src/lib/init.ts
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-detail/case-management-detail.component.ts
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-detail/tabs/case-management-general/components/case-management-missing-plugin-configurations/case-management-missing-plugin-configurations.component.html
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-detail/tabs/case-management-general/components/case-management-missing-plugin-configurations/case-management-missing-plugin-configurations.component.scss
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-detail/tabs/case-management-general/components/case-management-missing-plugin-configurations/case-management-missing-plugin-configurations.component.ts
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-upload/case-management-upload.component.html
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-upload/case-management-upload.component.scss
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-upload/case-management-upload.component.ts
  • frontend/projects/valtimo/case-management/src/lib/models/case-deployment.model.ts
  • frontend/projects/valtimo/case/src/lib/components/case-detail/case-detail.component.scss
  • frontend/projects/valtimo/case/src/lib/components/case-detail/tab/external-plugin/external-plugin.component.html
  • frontend/projects/valtimo/case/src/lib/components/case-detail/tab/external-plugin/external-plugin.component.scss
  • frontend/projects/valtimo/case/src/lib/components/case-detail/tab/external-plugin/external-plugin.component.ts
  • frontend/projects/valtimo/case/src/lib/models/external-plugin-tab.model.ts
  • frontend/projects/valtimo/case/src/lib/services/case-external-plugin-tab-api.service.ts
  • frontend/projects/valtimo/components/src/lib/components/drag-drop-list/drag-drop-list.component.html
  • frontend/projects/valtimo/components/src/lib/components/drag-drop-list/drag-drop-list.component.ts
  • frontend/projects/valtimo/components/src/lib/components/menu/menu-configuration.model.ts
  • frontend/projects/valtimo/components/src/lib/components/menu/menu-configuration.resolver.spec.ts
  • frontend/projects/valtimo/components/src/lib/components/menu/menu-configuration.resolver.ts
  • frontend/projects/valtimo/components/src/lib/components/menu/menu-configuration.seed.ts
  • frontend/projects/valtimo/components/src/lib/components/menu/menu-item-catalog.ts
  • frontend/projects/valtimo/components/src/lib/components/select/select.component.ts
  • frontend/projects/valtimo/components/src/lib/components/value-path-selector/value-path-selector.component.ts
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-add-modal/plugin-add-modal.component.scss
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-external-configure/plugin-external-configure.component.html
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-external-configure/plugin-external-configure.component.ts
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-external-edit-modal/plugin-external-edit-modal.component.html
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-external-edit-modal/plugin-external-edit-modal.component.ts
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-external-permissions/plugin-external-permissions.component.html
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-external-permissions/plugin-external-permissions.component.ts
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-log-modal/plugin-log-modal.component.html
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-log-modal/plugin-log-modal.component.scss
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-log-modal/plugin-log-modal.component.ts
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-management/plugin-management.component.ts
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-upload-modal/plugin-upload-modal.component.html
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-upload-modal/plugin-upload-modal.component.ts
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-usage-modal/plugin-usage-modal.component.scss
  • frontend/projects/valtimo/plugin/src/lib/components/external-plugin-iframe/external-plugin-iframe.component.html
  • frontend/projects/valtimo/plugin/src/lib/components/external-plugin-iframe/external-plugin-iframe.component.spec.ts
  • frontend/projects/valtimo/plugin/src/lib/components/external-plugin-iframe/external-plugin-iframe.component.ts
  • frontend/projects/valtimo/plugin/src/lib/components/external-plugin-page/external-plugin-page.component.html
  • frontend/projects/valtimo/plugin/src/lib/components/external-plugin-page/external-plugin-page.component.ts
  • frontend/projects/valtimo/plugin/src/lib/models/external-plugin.model.ts
  • frontend/projects/valtimo/plugin/src/lib/models/plugin.ts
  • frontend/projects/valtimo/plugin/src/lib/services/external-plugin-page.service.ts
  • frontend/projects/valtimo/plugin/src/lib/services/external-plugin-session.service.spec.ts
  • frontend/projects/valtimo/plugin/src/lib/services/external-plugin-session.service.ts
  • frontend/projects/valtimo/plugin/src/lib/services/index.ts
  • frontend/projects/valtimo/plugin/src/lib/utils/external-plugin-data-url.utils.ts
  • frontend/projects/valtimo/plugin/src/lib/utils/index.ts
  • frontend/projects/valtimo/plugin/src/public-api.ts
  • frontend/projects/valtimo/process-link/src/lib/components/configure-building-block-plugins/configure-building-block-plugins.component.html
  • frontend/projects/valtimo/process-link/src/lib/components/configure-building-block-plugins/configure-building-block-plugins.component.scss
  • frontend/projects/valtimo/process-link/src/lib/components/configure-building-block-plugins/configure-building-block-plugins.component.ts
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-configuration/plugin-action-configuration.component.html
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-configuration/plugin-action-configuration.component.ts
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-result-mappings/plugin-action-result-mappings.component.html
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-result-mappings/plugin-action-result-mappings.component.scss
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-result-mappings/plugin-action-result-mappings.component.ts
  • frontend/projects/valtimo/process-link/src/lib/components/process-link-modal/process-link-modal.component.html
  • frontend/projects/valtimo/process-link/src/lib/components/select-plugin-action/select-plugin-action.component.ts
  • frontend/projects/valtimo/process-link/src/lib/components/select-plugin-configuration/select-plugin-configuration.component.ts
  • frontend/projects/valtimo/process-link/src/lib/constants/process-link.test-ids.ts
  • frontend/projects/valtimo/process-link/src/lib/models/building-block-field.model.ts
  • frontend/projects/valtimo/process-link/src/lib/models/plugin.model.ts
  • frontend/projects/valtimo/process-link/src/lib/models/process-link.model.ts
  • frontend/projects/valtimo/process-link/src/lib/process-link.module.ts
  • frontend/projects/valtimo/process-link/src/lib/services/building-block-state.service.ts
  • frontend/projects/valtimo/process-link/src/lib/services/plugin-state.service.ts
  • frontend/projects/valtimo/process-link/src/lib/services/process-link-step.service.ts
  • frontend/projects/valtimo/shared/assets/core/en.json
  • frontend/projects/valtimo/shared/assets/core/nl.json
  • frontend/projects/valtimo/task/src/lib/components/task-external-plugin-form/task-external-plugin-form.component.html
  • frontend/projects/valtimo/task/src/lib/components/task-external-plugin-form/task-external-plugin-form.component.scss
  • frontend/projects/valtimo/task/src/lib/components/task-external-plugin-form/task-external-plugin-form.component.ts
  • frontend/release-plugins.json
  • plugin-host/README.md
  • plugin-host/TESTING.md
  • plugin-host/app/README.md
  • plugin-host/app/src/config-registry.test.ts
  • plugin-host/app/src/config-registry.ts
  • plugin-host/app/src/db/config-repository.ts
  • plugin-host/app/src/db/index.ts
  • plugin-host/app/src/host-functions/guard.ts
  • plugin-host/app/src/host-functions/gzac-api.test.ts
  • plugin-host/app/src/host-functions/gzac-api.ts
  • plugin-host/app/src/host-functions/http-request.test.ts
  • plugin-host/app/src/host-functions/http-request.ts
  • plugin-host/app/src/host-functions/kv.ts
  • plugin-host/app/src/host-functions/log.ts
  • plugin-host/app/src/index.ts
  • plugin-host/app/src/models/app-config.test.ts
  • plugin-host/app/src/models/app-config.ts
  • plugin-host/app/src/models/plugin-configuration.ts
  • plugin-host/app/src/plugin-manager.test.ts
  • plugin-host/app/src/plugin-manager.ts
  • plugin-host/app/src/routes/host-configurations.test.ts
  • plugin-host/app/src/routes/host-configurations.ts
  • plugin-host/app/src/routes/host-management.test.ts
  • plugin-host/app/src/routes/host-management.ts
  • plugin-host/app/src/routes/plugin-actions.test.ts
  • plugin-host/app/src/routes/plugin-data.test.ts
  • plugin-host/app/src/routes/plugin-data.ts
  • plugin-host/app/src/routes/plugin-logs.test.ts
  • plugin-host/app/src/routes/plugin-logs.ts
  • plugin-host/app/src/security/endpoint-allowlist.test.ts
  • plugin-host/app/src/security/endpoint-allowlist.ts
  • plugin-host/app/src/security/hmac-auth.test.ts
  • plugin-host/app/src/security/hmac-auth.ts
  • plugin-host/app/src/security/replay-cache.ts
  • plugin-host/app/src/security/user-token-introspection.test.ts
  • plugin-host/app/src/security/user-token-introspection.ts
  • plugin-host/app/src/test-support/harness.ts
  • plugin-host/app/test/integration/config-repository.int.test.ts
  • plugin-host/app/test/wasm/plugin-manager.wasm.test.ts
  • plugin-host/app/test/wasm/sdk-runtime.wasm.test.ts
  • plugin-host/docs/external-plugin-system-plan.md
  • plugin-host/plugin-sdk/README.md
  • plugin-host/plugin-sdk/bin/valtimo-plugin-pack.mjs
  • plugin-host/plugin-sdk/src/frontend/index.ts
  • plugin-host/plugin-sdk/src/frontend/plugin-frontend-sdk.test.ts
  • plugin-host/plugin-sdk/src/frontend/plugin-frontend-sdk.ts
  • plugin-host/plugin-sdk/src/manifest-validation.test.ts
  • plugin-host/plugin-sdk/src/manifest-validation.ts
  • plugin-host/plugin-sdk/src/models/types.ts
  • plugin-host/sample-plugins/case-summary/README.md
  • plugin-host/sample-plugins/case-summary/manifest.json
  • plugin-host/sample-plugins/case-summary/src/plugin.ts
  • plugin-host/test-fixtures/test-plugin/src/plugin.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/external-plugin-audit

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@mbritense mbritense changed the title Fix/external plugin audit feature: process external plugin security audit Jul 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants