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

mattyb149 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 e915e94e2e NIFI-15562 Fixed Symbolic Link resolution for directories 
in ListSFTP (#10866)
e915e94e2e is described below

commit e915e94e2e113304373654ade85e37f9fbd0c79b
Author: David Handermann <[email protected]>
AuthorDate: Fri Feb 6 13:58:04 2026 -0600

    NIFI-15562 Fixed Symbolic Link resolution for directories in ListSFTP 
(#10866)
    
    - Passed parent directory for full path resolution of entry attributes
---
 .../processors/standard/util/SFTPTransfer.java     |  8 +++---
 .../standard/util/TestServerSFTPTransfer.java      | 29 +++++++++++++++++++++-
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java
 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java
index 21d4d15595..a9f2fede9c 100644
--- 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java
+++ 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java
@@ -394,7 +394,7 @@ public class SFTPTransfer implements FileTransfer {
                 }
 
                 // remember directory for later recursive listing
-                if (isIncludedDirectory(dirEntry, recurse, symlink)) {
+                if (isIncludedDirectory(directory, dirEntry, recurse, 
symlink)) {
                     subDirectoryPaths.add(dirEntry);
                     continue;
                 }
@@ -462,19 +462,21 @@ public class SFTPTransfer implements FileTransfer {
     /**
      * Include remote resources when recursion is enabled or when symbolic 
links are enabled and the resource is a directory link
      *
+     * @param directory Directory path containing Directory Entry
      * @param dirEntry Remote Directory Entry
      * @param recursionEnabled Recursion enabled status
      * @param symlinksEnabled Follow symbolic links enabled
      * @return Included directory status
      */
-    private boolean isIncludedDirectory(final SftpClient.DirEntry dirEntry, 
final boolean recursionEnabled, final boolean symlinksEnabled) {
+    private boolean isIncludedDirectory(final String directory, final 
SftpClient.DirEntry dirEntry, final boolean recursionEnabled, final boolean 
symlinksEnabled) {
         boolean includedDirectory = false;
 
         final SftpClient.Attributes entryAttributes = dirEntry.getAttributes();
         if (entryAttributes.isDirectory()) {
             includedDirectory = recursionEnabled;
         } else if (symlinksEnabled && entryAttributes.isSymbolicLink()) {
-            final String path = dirEntry.getFilename();
+            final String filename = dirEntry.getFilename();
+            final String path = buildFullPath(directory, filename);
             try {
                 final SftpClient.Attributes attributes = sftpClient.stat(path);
                 includedDirectory = attributes.isDirectory();
diff --git 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestServerSFTPTransfer.java
 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestServerSFTPTransfer.java
index 39260d2c02..5dfe7b508b 100644
--- 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestServerSFTPTransfer.java
+++ 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestServerSFTPTransfer.java
@@ -70,6 +70,7 @@ public class TestServerSFTPTransfer {
     private static final String DIR_2 = "dir2";
     private static final String LINKED_DIRECTORY = "linked-directory";
     private static final String LINKED_FILE = "linked-file";
+    private static final String NESTED_LINK = "nested-link";
     private static final String EMPTY_DIRECTORY = "dir4";
 
     private static final String DIR_1_CHILD_1 = "child1";
@@ -79,6 +80,9 @@ public class TestServerSFTPTransfer {
     private static final String FILE_2 = "file2.txt";
     private static final String DOT_FILE = ".foo.txt";
 
+    private static final String FIRST_LEVEL_NESTED_DIRECTORY = 
"first-level-nested";
+    private static final String SECOND_LEVEL_NESTED_DIRECTORY = 
"second-level-nested";
+
     private static final boolean FILTERING_ENABLED = true;
 
     @TempDir
@@ -112,6 +116,15 @@ public class TestServerSFTPTransfer {
         final File emptyDirectory = new File(serverDirectory, EMPTY_DIRECTORY);
         assertTrue(emptyDirectory.mkdirs());
 
+        final File firstLevelNestedDirectory = new File(serverDirectory, 
FIRST_LEVEL_NESTED_DIRECTORY);
+        assertTrue(firstLevelNestedDirectory.mkdirs());
+        final File secondLevelNestedDirectory = new 
File(firstLevelNestedDirectory, SECOND_LEVEL_NESTED_DIRECTORY);
+        assertTrue(secondLevelNestedDirectory.mkdirs());
+
+        // Create nested link for verifying expected directory path resolution
+        final File nestedLink = new File(secondLevelNestedDirectory, 
NESTED_LINK);
+        Files.createSymbolicLink(nestedLink.toPath(), 
linkedDirectoryTarget.toPath());
+
         startServer();
     }
 
@@ -204,7 +217,21 @@ public class TestServerSFTPTransfer {
         try (final SFTPTransfer transfer = createSFTPTransfer(properties)) {
             final List<FileInfo> listing = 
transfer.getListing(FILTERING_ENABLED);
             assertNotNull(listing);
-            assertEquals(11, listing.size());
+            assertEquals(15, listing.size(), "Expected number of linked files 
not found");
+        }
+    }
+
+    @Test
+    public void testGetListingWithSymlinksNestedDirectory() throws IOException 
{
+        final Map<PropertyDescriptor, String> properties = 
createBaseProperties();
+        properties.put(SFTPTransfer.RECURSIVE_SEARCH, "true");
+        properties.put(SFTPTransfer.FOLLOW_SYMLINK, "true");
+        properties.put(SFTPTransfer.REMOTE_PATH, FIRST_LEVEL_NESTED_DIRECTORY);
+
+        try (final SFTPTransfer transfer = createSFTPTransfer(properties)) {
+            final List<FileInfo> listing = 
transfer.getListing(FILTERING_ENABLED);
+            assertNotNull(listing);
+            assertEquals(4, listing.size(), "Expected number of nested linked 
files not found");
         }
     }
 

Reply via email to