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

mosermw 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 f1457bad8e NIFI-14404 Cleared Sensitive Dynamic Property Names on 
Migration
f1457bad8e is described below

commit f1457bad8eaa3615c55225a6c19e699ceb102a10
Author: exceptionfactory <[email protected]>
AuthorDate: Fri Apr 18 15:13:56 2025 -0500

    NIFI-14404 Cleared Sensitive Dynamic Property Names on Migration
    
    - Updated overwriteProperties method to clear existing Sensitive Dynamic 
Property Names before setting updated values
    - Clearing existing values avoids validation issues when loading Flow 
Definitions that contain sensitive property descriptors which Components 
identified as renamed or removed
    
    Signed-off-by: Mike Moser <[email protected]>
    Closes #9885
---
 .../nifi/controller/AbstractComponentNode.java     | 12 +++++++----
 .../nifi/controller/TestAbstractComponentNode.java | 25 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
index 27b18743ab..b6011e6b59 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
@@ -238,13 +238,14 @@ public abstract class AbstractComponentNode implements 
ComponentNode {
      * @param properties Map of Property Name to Value
      */
     protected void overwriteProperties(final Map<String, String> properties) {
-        // Update properties.
         final Map<String, String> updatedProperties = new 
HashMap<>(properties);
-        final Set<String> sensitiveDynamicPropNames = new HashSet<>();
+
+        // Build set of Sensitive Dynamic Property Names based on updated 
Properties
+        final Set<String> updatedSensitiveDynamicPropertyNames = new 
HashSet<>();
         for (final String propertyName : updatedProperties.keySet()) {
             final PropertyDescriptor descriptor = 
getPropertyDescriptor(propertyName);
             if (descriptor != null && descriptor.isDynamic() && 
descriptor.isSensitive()) {
-                sensitiveDynamicPropNames.add(propertyName);
+                updatedSensitiveDynamicPropertyNames.add(propertyName);
             }
         }
 
@@ -253,7 +254,10 @@ public abstract class AbstractComponentNode implements 
ComponentNode {
             updatedProperties.putIfAbsent(descriptor.getName(), null);
         }
 
-        setProperties(updatedProperties, true, sensitiveDynamicPropNames);
+        // Clear existing Sensitive Dynamic Property Names to avoid cases 
where a sensitive property name has been changed or removed
+        sensitiveDynamicPropertyNames.getAndSet(Set.of());
+
+        setProperties(updatedProperties, true, 
updatedSensitiveDynamicPropertyNames);
     }
 
     /**
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/test/java/org/apache/nifi/controller/TestAbstractComponentNode.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/test/java/org/apache/nifi/controller/TestAbstractComponentNode.java
index c83b352160..ed27ec5937 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/test/java/org/apache/nifi/controller/TestAbstractComponentNode.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/test/java/org/apache/nifi/controller/TestAbstractComponentNode.java
@@ -78,6 +78,10 @@ public class TestAbstractComponentNode {
 
     private static final String PROPERTY_VALUE = "abstract-property-value";
 
+    private static final String SECOND_PROPERTY_NAME = "Second Property";
+
+    private static final String SECOND_PROPERTY_VALUE = "2";
+
     @Timeout(5)
     @Test
     public void testGetValidationStatusWithTimeout() {
@@ -399,6 +403,27 @@ public class TestAbstractComponentNode {
         assertFalse(removedPropertyDescriptor.isSensitive());
     }
 
+    @Test
+    public void testOverwritePropertiesSensitiveDynamicPropertyNames() {
+        final AbstractComponentNode node = new LocalComponentNode();
+
+        final Map<String, String> properties = Map.of(PROPERTY_NAME, 
PROPERTY_VALUE);
+        final Set<String> sensitiveDynamicPropertyNames = 
Collections.singleton(PROPERTY_NAME);
+        node.setProperties(properties, false, sensitiveDynamicPropertyNames);
+
+        final PropertyDescriptor propertyDescriptor = 
node.getPropertyDescriptor(PROPERTY_NAME);
+        assertTrue(propertyDescriptor.isDynamic());
+        assertTrue(propertyDescriptor.isSensitive());
+
+        // Overwrite Properties which clears existing Sensitive Dynamic 
Property Names
+        final Map<String, String> secondProperties = 
Map.of(SECOND_PROPERTY_NAME, SECOND_PROPERTY_VALUE);
+        node.overwriteProperties(secondProperties);
+
+        final PropertyDescriptor updatedPropertyDescriptor = 
node.getPropertyDescriptor(PROPERTY_NAME);
+        assertTrue(updatedPropertyDescriptor.isDynamic());
+        assertFalse(updatedPropertyDescriptor.isSensitive());
+    }
+
     private ValidationContext getServiceValidationContext(final 
ControllerServiceState serviceState, final ControllerServiceProvider 
serviceProvider) {
         final ValidationContext context = mock(ValidationContext.class);
 

Reply via email to