This is an automated email from the ASF dual-hosted git repository.

pvillard31 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 4e8c711b979 NIFI-16148 Aligned Parameter Context Update Authorization 
(#11479)
4e8c711b979 is described below

commit 4e8c711b97921de8ce2465b43df79e089ea77a59
Author: David Handermann <[email protected]>
AuthorDate: Mon Jul 27 14:51:52 2026 -0500

    NIFI-16148 Aligned Parameter Context Update Authorization (#11479)
---
 .../nifi/web/api/ParameterContextResource.java     | 56 +++++++++++++++++-----
 1 file changed, 44 insertions(+), 12 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterContextResource.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterContextResource.java
index 692b0184459..87e5ac45384 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterContextResource.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterContextResource.java
@@ -89,6 +89,7 @@ import 
org.apache.nifi.web.api.entity.ComponentValidationResultEntity;
 import org.apache.nifi.web.api.entity.ComponentValidationResultsEntity;
 import org.apache.nifi.web.api.entity.Entity;
 import org.apache.nifi.web.api.entity.ParameterContextEntity;
+import org.apache.nifi.web.api.entity.ParameterContextReferenceEntity;
 import org.apache.nifi.web.api.entity.ParameterContextUpdateRequestEntity;
 import org.apache.nifi.web.api.entity.ParameterContextValidationRequestEntity;
 import org.apache.nifi.web.api.entity.ParameterEntity;
@@ -187,6 +188,39 @@ public class ParameterContextResource extends 
AbstractParameterResource {
         });
     }
 
+    private void authorizeReadWriteParameterContextWithComponents(
+            final AuthorizableLookup lookup,
+            final String parameterContextId,
+            final ParameterContextEntity requestEntity,
+            final Set<AffectedComponentEntity> affectedComponents,
+            final NiFiUser user
+    ) {
+        authorizeReadWriteParameterContext(parameterContextId);
+
+        // Verify READ and WRITE permissions for affected Components
+        affectedComponents.forEach(component -> 
parameterUpdateManager.authorizeAffectedComponent(component, lookup, user, 
true, true));
+
+        final ParameterContext parameterContext = 
lookup.getParameterContext(parameterContextId);
+
+        // Verify READ on inherited Parameter Contexts
+        for (final ParameterContext inheritedParameterContext : 
parameterContext.getInheritedParameterContexts()) {
+            inheritedParameterContext.authorize(authorizer, 
RequestAction.READ, user);
+        }
+
+        // Verify READ on requested inherited Parameter Contexts
+        final List<ParameterContextReferenceEntity> 
requestedInheritedParameterContexts = 
requestEntity.getComponent().getInheritedParameterContexts();
+        if (requestedInheritedParameterContexts != null) {
+            for (final ParameterContextReferenceEntity 
requestedInheritedParameterContext : requestedInheritedParameterContexts) {
+                final String requestedId = 
requestedInheritedParameterContext.getId();
+                // Parameter Context existence check in prior verification 
methods
+                final ParameterContext requestedParameterContext = 
lookup.getParameterContext(requestedId);
+                requestedParameterContext.authorize(authorizer, 
RequestAction.READ, user);
+            }
+        }
+
+        validateControllerServiceReferences(requestEntity, lookup, 
parameterContext, user);
+    }
+
     @GET
     @Consumes(MediaType.WILDCARD)
     @Produces(MediaType.APPLICATION_JSON)
@@ -312,7 +346,11 @@ public class ParameterContextResource extends 
AbstractParameterResource {
                     "/parameter-contexts/update-requests endpoint. That 
endpoint will, in turn, call this endpoint.",
             security = {
                     @SecurityRequirement(name = "Read - 
/parameter-contexts/{id}"),
-                    @SecurityRequirement(name = "Write - 
/parameter-contexts/{id}")
+                    @SecurityRequirement(name = "Write - 
/parameter-contexts/{id}"),
+                    @SecurityRequirement(name = "Read - for every component 
that is affected by the update"),
+                    @SecurityRequirement(name = "Write - for every component 
that is affected by the update"),
+                    @SecurityRequirement(name = "Read - for every currently 
inherited parameter context"),
+                    @SecurityRequirement(name = "Read - for any new inherited 
parameter context")
             }
     )
     public Response updateParameterContext(
@@ -347,12 +385,15 @@ public class ParameterContextResource extends 
AbstractParameterResource {
             
verifyDisconnectedNodeModification(requestEntity.isDisconnectedNodeAcknowledged());
         }
 
+        final NiFiUser user = NiFiUserUtils.getNiFiUser();
+        final Set<AffectedComponentEntity> affectedComponents = 
serviceFacade.getComponentsAffectedByParameterContextUpdate(Collections.singletonList(updateDto));
+
         final Revision requestRevision = 
getRevision(requestEntity.getRevision(), updateDto.getId());
         return withWriteLock(
                 serviceFacade,
                 requestEntity,
                 requestRevision,
-                lookup -> authorizeReadWriteParameterContext(contextId),
+                lookup -> 
authorizeReadWriteParameterContextWithComponents(lookup, contextId, 
requestEntity, affectedComponents, user),
                 () -> serviceFacade.verifyUpdateParameterContext(updateDto, 
true),
                 (rev, entity) -> {
                     final ParameterContextEntity updatedEntity = 
serviceFacade.updateParameterContext(rev, entity.getComponent());
@@ -728,16 +769,7 @@ public class ParameterContextResource extends 
AbstractParameterResource {
                 serviceFacade,
                 requestWrapper,
                 requestRevision,
-                lookup -> {
-                    // Verify READ and WRITE permissions for user, for the 
Parameter Context itself
-                    authorizeReadWriteParameterContext(contextId);
-
-                    // Verify READ and WRITE permissions for user, for every 
component that is affected
-                    affectedComponents.forEach(component -> 
parameterUpdateManager.authorizeAffectedComponent(component, lookup, user, 
true, true));
-
-                    final ParameterContext parameterContext = 
lookup.getParameterContext(contextId);
-                    validateControllerServiceReferences(requestEntity, lookup, 
parameterContext, user);
-                },
+                lookup -> 
authorizeReadWriteParameterContextWithComponents(lookup, contextId, 
requestEntity, affectedComponents, user),
                 () -> {
                     // Verify Request
                     serviceFacade.verifyUpdateParameterContext(contextDto, 
false);

Reply via email to