diff --git a/.github/workflows/frontend_build_push_docker_image.yml b/.github/workflows/frontend_build_push_docker_image.yml index e92446a003..6adc25fa8e 100644 --- a/.github/workflows/frontend_build_push_docker_image.yml +++ b/.github/workflows/frontend_build_push_docker_image.yml @@ -125,29 +125,9 @@ jobs: name: ${{ inputs.frontend_libraries_build_artifact_name }} path: frontend/dist/ - - name: Add release plugin dependencies - shell: bash - run: | - set -euo pipefail - - # Plugin packages live outside package.json so local dev (npm start) - # doesn't pull them in — the workspace symlinks would break Vite's - # pre-bundling of their @valtimo/* transitive imports. Release builds - # use fileReplacements to swap src/app/app-plugins.ts -> .prod.ts, - # which imports these packages; CI installs them here per-branch - # using the pins in release-plugins.json. - if [ ! -f "release-plugins.json" ]; then - echo "::notice::release-plugins.json not found; skipping release plugin pin" - exit 0 - fi - - jq -r 'to_entries[] | "dependencies.\(.key)=\(.value)"' release-plugins.json \ - | while IFS= read -r entry; do - npm pkg set "$entry" - done - - echo "Release plugin pins applied:" - jq -r 'to_entries[] | " \(.key)@\(.value)"' release-plugins.json + # The @valtimo-plugins/* packages are plain dependencies in package.json and + # are imported directly by the apps, so no per-branch pinning step is needed + # here; the install below brings them in. - name: "Rewrite local @valtimo/* deps to file: links and install" shell: bash diff --git a/backend/apps/valtimo/src/main/resources/config/application.yml b/backend/apps/valtimo/src/main/resources/config/application.yml index f43613443b..5de07f0529 100644 --- a/backend/apps/valtimo/src/main/resources/config/application.yml +++ b/backend/apps/valtimo/src/main/resources/config/application.yml @@ -163,9 +163,6 @@ valtimo: secret: dummy rsin: dummy database: postgres - changelog: - pbac: - clear-tables: true security: whitelist: hosts: diff --git a/backend/core/src/main/kotlin/com/ritense/valtimo/camunda/authorization/CamundaTaskActionProvider.kt b/backend/core/src/main/kotlin/com/ritense/valtimo/camunda/authorization/CamundaTaskActionProvider.kt index 00cf13fe09..89d7c111db 100644 --- a/backend/core/src/main/kotlin/com/ritense/valtimo/camunda/authorization/CamundaTaskActionProvider.kt +++ b/backend/core/src/main/kotlin/com/ritense/valtimo/camunda/authorization/CamundaTaskActionProvider.kt @@ -22,7 +22,7 @@ import com.ritense.valtimo.camunda.domain.CamundaTask class CamundaTaskActionProvider : ResourceActionProvider { override fun getAvailableActions(): List> { - return listOf(ASSIGN, ASSIGNABLE, CLAIM, COMPLETE, VIEW_LIST, VIEW) + return listOf(ASSIGN, ASSIGNABLE, CLAIM, COMPLETE, VIEW_LIST, VIEW, MODIFY) } companion object { diff --git a/backend/value-resolver/build.gradle b/backend/value-resolver/build.gradle index a3206a11ac..e6c84a2d26 100644 --- a/backend/value-resolver/build.gradle +++ b/backend/value-resolver/build.gradle @@ -36,6 +36,12 @@ dockerCompose { } dependencies { + // Only the @RunWithoutAuthorization annotation is needed; the aspect that acts + // on it lives in :backend:authorization and is present in every application. + // Keeping this compileOnly avoids putting AuthorizationAutoConfiguration on the + // runtime classpath of consumers that do not have the authorization tables — the + // module's own integration test context being the first of them. + compileOnly(project(":backend:authorization")) implementation(project(":backend:contract")) implementation(project(":backend:logging")) diff --git a/backend/value-resolver/src/main/kotlin/com/ritense/valueresolver/web/rest/ValueResolverResource.kt b/backend/value-resolver/src/main/kotlin/com/ritense/valueresolver/web/rest/ValueResolverResource.kt index d70f1a3879..28c53db71c 100644 --- a/backend/value-resolver/src/main/kotlin/com/ritense/valueresolver/web/rest/ValueResolverResource.kt +++ b/backend/value-resolver/src/main/kotlin/com/ritense/valueresolver/web/rest/ValueResolverResource.kt @@ -16,6 +16,7 @@ package com.ritense.valueresolver.web.rest +import com.ritense.authorization.annotation.RunWithoutAuthorization import com.ritense.valtimo.contract.annotation.SkipComponentScan import com.ritense.valtimo.contract.domain.ValtimoMediaType.APPLICATION_JSON_UTF8_VALUE import com.ritense.valueresolver.ValueResolverOption @@ -36,11 +37,13 @@ import org.springframework.web.bind.annotation.RestController class ValueResolverResource( private val valueResolverService: ValueResolverService ) { + @RunWithoutAuthorization @GetMapping("/management/v1/value-resolver") fun getValueResolvers(): ResponseEntity> { return ResponseEntity.ok(valueResolverService.getValueResolvers()) } + @RunWithoutAuthorization @PostMapping("/management/v1/value-resolver/document-definition/{documentDefinitionName}/keys") fun getResolvableKeys( @PathVariable documentDefinitionName: String, @@ -53,6 +56,7 @@ class ValueResolverResource( return ResponseEntity.ok(options.map { it.path }) } + @RunWithoutAuthorization @PostMapping("/management/v2/value-resolver/document-definition/{documentDefinitionName}/keys") fun getResolvableKeys( @PathVariable documentDefinitionName: String, @@ -61,6 +65,7 @@ class ValueResolverResource( return ResponseEntity.ok(valueResolverService.getResolvableKeys(request, documentDefinitionName)) } + @RunWithoutAuthorization @PostMapping("/management/v1/value-resolver/document-definition/{documentDefinitionName}/version/{version}/keys") fun getResolvableKeys( @PathVariable documentDefinitionName: String, @@ -75,6 +80,7 @@ class ValueResolverResource( return ResponseEntity.ok(options.map { it.path }) } + @RunWithoutAuthorization @PostMapping("/management/v2/value-resolver/document-definition/{documentDefinitionName}/version/{version}/keys") fun getResolvableKeys( @PathVariable documentDefinitionName: String, diff --git a/frontend/apps/gzac/src/app/app.module.ts b/frontend/apps/gzac/src/app/app.module.ts index 3a6407df22..c5259ea8b9 100644 --- a/frontend/apps/gzac/src/app/app.module.ts +++ b/frontend/apps/gzac/src/app/app.module.ts @@ -102,6 +102,15 @@ import { ZgwModule } from '@valtimo/zgw'; import {LoggingModule} from '@valtimo/logging'; +import {SmtpMailPluginModule, smtpmailPluginSpecification} from '@valtimo-plugins/smtpmail'; +import { + DocumentGeneratorPluginModule, + documentGeneratorPluginSpecification, + MailTemplatePluginModule, + mailTemplatePluginSpecification, + TextTemplatePluginModule, + textTemplatePluginSpecification, +} from '@valtimo-plugins/freemarker'; export function tabsFactory() { return new Map([ @@ -188,7 +197,11 @@ export function tabsFactory() { TranslationManagementModule, TaskManagementModule, ZgwModule, - LoggingModule + LoggingModule, + SmtpMailPluginModule, + MailTemplatePluginModule, + TextTemplatePluginModule, + DocumentGeneratorPluginModule, ], providers: [{ provide: PLUGINS_TOKEN, @@ -205,7 +218,11 @@ export function tabsFactory() { notificatiesApiPluginSpecification, openNotificatiesPluginSpecification, portaaltaakPluginSpecification, - verzoekPluginSpecification + verzoekPluginSpecification, + smtpmailPluginSpecification, + mailTemplatePluginSpecification, + textTemplatePluginSpecification, + documentGeneratorPluginSpecification, ] }], bootstrap: [AppComponent] diff --git a/frontend/apps/valtimo/src/app/app-plugins.prod.ts b/frontend/apps/valtimo/src/app/app-plugins.prod.ts deleted file mode 100644 index 7b1d5aad88..0000000000 --- a/frontend/apps/valtimo/src/app/app-plugins.prod.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2015-2026 Ritense BV, the Netherlands. - * - * Licensed under EUPL, Version 1.2 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Used by production/release builds via angular.json fileReplacements (swapped -// in for app-plugins.ts). CI installs the @valtimo-plugins/* packages from -// release-plugins.json before building. -import {SmtpMailPluginModule, smtpmailPluginSpecification} from '@valtimo-plugins/smtpmail'; -import { - MailTemplatePluginModule, - mailTemplatePluginSpecification, - TextTemplatePluginModule, - textTemplatePluginSpecification, -} from '@valtimo-plugins/freemarker'; - -export const pluginImports = [ - SmtpMailPluginModule, - MailTemplatePluginModule, - TextTemplatePluginModule, -]; - -export const pluginSpecifications = [ - smtpmailPluginSpecification, - mailTemplatePluginSpecification, - textTemplatePluginSpecification, -]; diff --git a/frontend/apps/valtimo/src/app/app-plugins.ts b/frontend/apps/valtimo/src/app/app-plugins.ts deleted file mode 100644 index ef4e1e94db..0000000000 --- a/frontend/apps/valtimo/src/app/app-plugins.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2015-2026 Ritense BV, the Netherlands. - * - * Licensed under EUPL, Version 1.2 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Local dev builds use this empty stub so the @valtimo-plugins/* packages are -// not in the import graph. Release builds swap to app-plugins.prod.ts via -// angular.json fileReplacements; CI installs the matching packages from -// release-plugins.json before building. -export const pluginImports: any[] = []; -export const pluginSpecifications: any[] = []; diff --git a/frontend/apps/valtimo/src/app/app.module.ts b/frontend/apps/valtimo/src/app/app.module.ts index 483471e297..62cb744b69 100644 --- a/frontend/apps/valtimo/src/app/app.module.ts +++ b/frontend/apps/valtimo/src/app/app.module.ts @@ -78,7 +78,6 @@ import {DashboardManagementModule} from '@valtimo/dashboard-management'; import {TaskManagementModule} from '@valtimo/task-management'; import {CaseMigrationModule} from '@valtimo/case-migration'; import {LoggingModule} from '@valtimo/logging'; -import {pluginImports, pluginSpecifications} from './app-plugins'; export function tabsFactory() { return new Map([ @@ -155,7 +154,6 @@ export function tabsFactory() { TranslationManagementModule, TaskManagementModule, LoggingModule, - ...pluginImports, ], providers: [{ provide: PLUGINS_TOKEN, @@ -163,7 +161,6 @@ export function tabsFactory() { objectenApiPluginSpecification, objecttypenApiPluginSpecification, objectTokenAuthenticationPluginSpecification, - ...pluginSpecifications, ] }], bootstrap: [AppComponent] diff --git a/frontend/package-lock.json b/frontend/package-lock.json index aa9380abf2..04d2e9d077 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -45,6 +45,8 @@ "@types/topojson": "3.2.6", "@typescript-eslint/eslint-plugin": "8.0.1", "@typescript-eslint/parser": "8.0.1", + "@valtimo-plugins/freemarker": "8.5.3-V12", + "@valtimo-plugins/smtpmail": "1.0.2", "@webcomponents/custom-elements": "1.6.0", "angular-split": "18.0.0-beta.1", "bootstrap": "4.6.2", @@ -7524,6 +7526,72 @@ "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", "license": "ISC" }, + "node_modules/@valtimo-plugins/freemarker": { + "version": "8.5.3-V12", + "resolved": "https://registry.npmjs.org/@valtimo-plugins/freemarker/-/freemarker-8.5.3-V12.tgz", + "integrity": "sha512-RaDFZh44PGrhZszPAurjSFCU5roraSyL4kVbPOw+jKmvVWAzpxK3OUbpP3l316G8DchR5JUSUYLExGJo+lcggA==", + "license": "EUPL-1.2", + "dependencies": { + "@angular/forms": "^19.2.8", + "ngx-spinner": "19.0.0", + "tslib": "2.8.1" + }, + "peerDependencies": { + "@angular/common": "^19.2.8", + "@angular/core": "^19.2.8" + } + }, + "node_modules/@valtimo-plugins/freemarker/node_modules/@angular/forms": { + "version": "19.2.25", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.25.tgz", + "integrity": "sha512-lbuhZiuNKy8vcIHFSP7sOW5kfHSVDiVsXh2/+rWjqGklscfUG5cTK9F9d+k60CH24OhK0NgRKoCHiAK5zPQi2g==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.2.25", + "@angular/core": "19.2.25", + "@angular/platform-browser": "19.2.25", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@valtimo-plugins/freemarker/node_modules/ngx-spinner": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/ngx-spinner/-/ngx-spinner-19.0.0.tgz", + "integrity": "sha512-UqmYvLfPyA1AkLw3xGe7NscIiJVG7u9j7NMW10J38Kp8EXv8l/pQdLlqFJS5x70dbRkt90lvOIvEBZM8b/rN7g==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": ">=19.0.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0" + } + }, + "node_modules/@valtimo-plugins/freemarker/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@valtimo-plugins/smtpmail": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@valtimo-plugins/smtpmail/-/smtpmail-1.0.2.tgz", + "integrity": "sha512-7lzdM9aVYPYMnc+5LE1EohP4hO3v+dfcd1/olH5hmBCRskTU1daeq5RBSW2lwdIQOGKPtiIewvWch1bt46NSnw==", + "license": "EUPL-1.2", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^17.2.2", + "@angular/core": "^17.2.2" + } + }, "node_modules/@valtimo/access-control": { "resolved": "dist/valtimo/access-control", "link": true diff --git a/frontend/package.json b/frontend/package.json index 2a55a29f00..f3c6c4f988 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -239,6 +239,8 @@ "@types/topojson": "3.2.6", "@typescript-eslint/eslint-plugin": "8.0.1", "@typescript-eslint/parser": "8.0.1", + "@valtimo-plugins/freemarker": "8.5.3-V12", + "@valtimo-plugins/smtpmail": "1.0.2", "@webcomponents/custom-elements": "1.6.0", "angular-split": "18.0.0-beta.1", "bootstrap": "4.6.2", diff --git a/frontend/release-plugins.json b/frontend/release-plugins.json deleted file mode 100644 index 0b0a243fda..0000000000 --- a/frontend/release-plugins.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "@valtimo-plugins/freemarker": "8.5.1-V12", - "@valtimo-plugins/smtpmail": "1.0.2" -} diff --git a/gradle.properties b/gradle.properties index 8b79f19e2b..de655bd743 100644 --- a/gradle.properties +++ b/gradle.properties @@ -61,7 +61,7 @@ sonarqubePluginVersion=4.4.1.3373 dockerComposePluginVersion=0.17.10 dependencyLicenseReportVersion=2.8 jreleaserPluginVersion=1.23.0 -freemarkerPluginVersion=8.5.1-V12 +freemarkerPluginVersion=8.5.3-V12 smtpmailPluginVersion=1.0.2 groovyVersion=4.0.22