private DownloadableContent getFlowFileContent( final String connectionId, final String flowfileId, final String dataUri) { // TODO - ensure the user is authorized - not checking with @PreAuthorized annotation as aspect // not trigger on call within a class // if (!NiFiUserUtils.getAuthorities().contains(Authority.ROLE_DFM.toString())) { // throw new AccessDeniedException("Access is denied."); // } return serviceFacade.getContent(connectionId, flowfileId, dataUri); }
private DownloadableContent getProvenanceEventContent( final Long eventId, final String dataUri, final ContentDirection direction) { // TODO - ensure the user is authorized - not checking with @PreAuthorized annotation as aspect // not trigger on call within a class // if (!NiFiUserUtils.getAuthorities().contains(Authority.ROLE_PROVENANCE.toString())) { // throw new AccessDeniedException("Access is denied."); // } return serviceFacade.getContent(eventId, dataUri, direction); }
@Override @PreAuthorize("hasRole('ROLE_PROVENANCE')") public DownloadableContent getContent(final ContentRequestContext request) { // if clustered, send request to cluster manager if (properties.isClusterManager()) { // get the URI URI dataUri; try { dataUri = new URI(request.getDataUri()); } catch (final URISyntaxException use) { throw new ClusterRequestException(use); } // set the request parameters final MultivaluedMap<String, String> parameters = new MultivaluedMapImpl(); parameters.add(CLIENT_ID_PARAM, request.getClientId()); // set the headers final Map<String, String> headers = new HashMap<>(); if (StringUtils.isNotBlank(request.getProxiedEntitiesChain())) { headers.put("X-ProxiedEntitiesChain", request.getProxiedEntitiesChain()); } // add the user's authorities (if any) to the headers final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null) { final Object userDetailsObj = authentication.getPrincipal(); if (userDetailsObj instanceof NiFiUserDetails) { // serialize user details object final String hexEncodedUserDetails = WebUtils.serializeObjectToHex((Serializable) userDetailsObj); // put serialized user details in header headers.put("X-ProxiedEntityUserDetails", hexEncodedUserDetails); } } // get the target node and ensure it exists final Node targetNode = clusterManager.getNode(request.getClusterNodeId()); if (targetNode == null) { throw new UnknownNodeException("The specified cluster node does not exist."); } final Set<NodeIdentifier> targetNodes = new HashSet<>(); targetNodes.add(targetNode.getNodeId()); // replicate the request to the specific node final NodeResponse nodeResponse = clusterManager.applyRequest(HttpMethod.GET, dataUri, parameters, headers, targetNodes); final ClientResponse clientResponse = nodeResponse.getClientResponse(); final MultivaluedMap<String, String> responseHeaders = clientResponse.getHeaders(); // get the file name final String contentDisposition = responseHeaders.getFirst("Content-Disposition"); final String filename = StringUtils.substringBetween(contentDisposition, "filename=\"", "\""); // get the content type final String contentType = responseHeaders.getFirst("Content-Type"); // create the downloadable content return new DownloadableContent(filename, contentType, clientResponse.getEntityInputStream()); } else { // example URI: http://localhost:8080/nifi-api/controller/provenance/events/1/content/input final String eventDetails = StringUtils.substringAfterLast(request.getDataUri(), "events/"); final String rawEventId = StringUtils.substringBefore(eventDetails, "/content/"); final String rawDirection = StringUtils.substringAfterLast(eventDetails, "/content/"); // get the content type final Long eventId; final ContentDirection direction; try { eventId = Long.parseLong(rawEventId); direction = ContentDirection.valueOf(rawDirection.toUpperCase()); } catch (final IllegalArgumentException iae) { throw new IllegalArgumentException("The specified data reference URI is not valid."); } return serviceFacade.getContent(eventId, request.getDataUri(), direction); } }