Github user markobean commented on a diff in the pull request:

    https://github.com/apache/nifi/pull/2703#discussion_r194730011
  
    --- Diff: 
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
 ---
    @@ -1338,6 +1339,67 @@ private void authorizeReplay(final 
ProvenanceEventRecord event) {
             dataAuthorizable.authorize(authorizer, RequestAction.WRITE, user, 
eventAttributes);
         }
     
    +    private AuthorizationResult 
checkAuthorizationForData(ProvenanceEventRecord event) {
    +        final NiFiUser user = NiFiUserUtils.getNiFiUser();
    +        final Authorizable dataAuthorizable;
    +        if (event.isRemotePortType()) {
    +            dataAuthorizable = 
flowController.createRemoteDataAuthorizable(event.getComponentId());
    +        } else {
    +            dataAuthorizable = 
flowController.createLocalDataAuthorizable(event.getComponentId());
    +        }
    +
    +        final Map<String, String> eventAttributes = event.getAttributes();
    +
    +        // ensure we can read the data
    +        return dataAuthorizable.checkAuthorization(authorizer, 
RequestAction.READ, user, eventAttributes);
    +    }
    +
    +    private AuthorizationResult checkAuthorizationForProvenanceData(final 
ProvenanceEventRecord event) {
    +        final ProcessGroup rootGroup = 
flowController.getGroup(getRootGroupId());
    +        final NiFiUser user = NiFiUserUtils.getNiFiUser();
    +        final String componentId = event.getComponentId();
    +        Connectable connectable;
    +        String targetId = null;
    +        // check if the component is the rootGroup
    +        if (getRootGroupId().equals(componentId)) {
    +            targetId = componentId;
    +        }
    +        if (targetId == null) {
    +            // check if the component is a processor
    +            connectable = rootGroup.findProcessor(componentId);
    +            if (connectable == null) {
    +                // if the component id is not a processor then consider a 
connection
    +                connectable = 
rootGroup.findConnection(componentId).getSource();
    +
    +                if (connectable == null) {
    +                    throw new ResourceNotFoundException("The component 
that generated this event is no longer part of the data flow");
    +                }
    +            }
    +            targetId = connectable.getIdentifier();
    +        }
    +        final Authorizable provenanceDataAuthorizable = 
flowController.createProvenanceDataAuthorizable(targetId);
    +
    +        return provenanceDataAuthorizable.checkAuthorization(authorizer, 
RequestAction.READ, user);
    +    }
    +
    +    private AuthorizationResult checkConnectableAuthorization(final String 
componentId) {
    +        final ProcessGroup rootGroup = 
flowController.getGroup(getRootGroupId());
    +        final NiFiUser user = NiFiUserUtils.getNiFiUser();
    +        if (rootGroup.getIdentifier().equals(componentId)) {
    +            return rootGroup.checkAuthorization(authorizer, 
RequestAction.READ, user);
    +        }
    +        Connectable connectable = 
rootGroup.findLocalConnectable(componentId);
    --- End diff --
    
    Will findLocalConnectable() versus findProcessor() include connections as 
well? If so, then this should return to findProcessor() to account for 
connections and subsequently finding the connection's source component.


---

Reply via email to