From 4f39b08db640de98a5e93fa786313c11b2e2dd46 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Thu, 16 Jul 2026 15:12:15 +0100 Subject: [PATCH] Bug 43078: Include longname and perms keys in FTP's NLST fallback listing The MLSD path, SFTP, and Local always return all six documented list_files() keys (filename, longname, size, perms, mtime, type) - undef where the value is unknown, but the key always present. The NLST fallback path (servers without MLSD support) only set filename, size, mtime and type, omitting longname and perms entirely rather than setting them to undef. Functionally harmless for consumers reading $file->{perms} (Perl returns undef for a missing hash key too), but it breaks the "same flat shape" contract this bug established, and would trip up any consumer using exists() instead of defined() to check for a key. Test plan: 1. prove t/db_dependent/Koha/File/Transport/FTP.t => All tests successful, including the new assertion that longname and perms keys are present (as undef) on the NLST fallback path. 2. koha-qa.pl -v 2 --more-tests => [PASS], no critic/pod warnings. Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: Lucas Gass --- Koha/File/Transport/FTP.pm | 2 ++ t/db_dependent/Koha/File/Transport/FTP.t | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Koha/File/Transport/FTP.pm b/Koha/File/Transport/FTP.pm index 5600bd4db8..e6ad0c49d3 100644 --- a/Koha/File/Transport/FTP.pm +++ b/Koha/File/Transport/FTP.pm @@ -232,7 +232,9 @@ sub _list_files { my $size = $self->{connection}->size($name); push @file_list, { filename => $name, + longname => undef, size => $size, + perms => undef, mtime => $self->{connection}->mdtm($name), type => defined $size ? 'file' : 'directory', }; diff --git a/t/db_dependent/Koha/File/Transport/FTP.t b/t/db_dependent/Koha/File/Transport/FTP.t index e781a2f8e3..b1bdc19b91 100755 --- a/t/db_dependent/Koha/File/Transport/FTP.t +++ b/t/db_dependent/Koha/File/Transport/FTP.t @@ -211,7 +211,7 @@ subtest 'list_files() MLSD tests' => sub { }; subtest 'list_files() NLST fallback tests' => sub { - plan tests => 10; + plan tests => 11; $schema->storage->txn_begin; @@ -277,6 +277,11 @@ subtest 'list_files() NLST fallback tests' => sub { is( $subdir->{type}, 'directory', 'SIZE failing is treated as a directory' ); is( $subdir->{perms}, undef, 'perms stay undef on the NLST fallback path' ); + ok( + exists( $quote->{longname} ) && exists( $quote->{perms} ), + 'longname and perms keys are present (as undef) on the NLST fallback path, matching the MLSD/SFTP/Local shape' + ); + $transport->{connection} = undef; $schema->storage->txn_rollback;