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");
}
}