Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package filezilla for openSUSE:Factory checked in at 2026-05-05 15:16:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/filezilla (Old) and /work/SRC/openSUSE:Factory/.filezilla.new.30200 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "filezilla" Tue May 5 15:16:53 2026 rev:122 rq:1350866 version:3.70.4 Changes: -------- --- /work/SRC/openSUSE:Factory/filezilla/filezilla.changes 2026-04-20 16:10:58.956375479 +0200 +++ /work/SRC/openSUSE:Factory/.filezilla.new.30200/filezilla.changes 2026-05-05 15:18:10.774068312 +0200 @@ -1,0 +2,26 @@ +Mon May 4 09:58:46 UTC 2026 - ecsos <[email protected]> - 3.70.4 + +- Update to 3.70.4 + * Bugfixes and minor changes: + - Updated to libfilezilla 0.55.4 to address a crash + - SFTP: Updated to fzssh 1.2.0 +- Changes from 3.70.3 + * Bugfixes and minor changes: + - SFTP: Added a heuristic to reply to a keyboard-interactive + request with the site's password, if it consists of a single + prompt named "Password" + - SFTP: Updated to fzssh 1.1.10 for increased compatibility with + broken servers that blatantly violate the SSH specifications +- Changes from 3.70.2 + * Bugfixes and minor changes: + - SFTP: Updated to fzssh 1.1.9 to address an issue with servers + sending nonsensical SSH_MSG_USERAUTH_INFO_REQUEST packages +- Changes from 3.70.1 + * Bugfixes and minor changes: + - SFTP: Updated to fzssh 1.1.8 to address an issue with servers + sending empty longnames + - SFTP: Updated to fzssh 1.1.8 to address an issue with servers + incapable of handling large receive windows of 2^32 - 1 bytes + - SFTP: Fixed an issue creating directories during file upload + +------------------------------------------------------------------- @@ -6,2 +32,5 @@ - - Replacing of invalid characters in filenames when downloading can no longer be disabled - - If saving of password was disabled, temporarily remembering passwords until FileZilla gets closed could result in additional password prompts + - Replacing of invalid characters in filenames when downloading + can no longer be disabled + - If saving of password was disabled, temporarily remembering + passwords until FileZilla gets closed could result in additional + password prompts @@ -9 +38,2 @@ - - FileZilla is now distributed under the terms of the GPL version 3 or later (formerly version 2 or later) + - FileZilla is now distributed under the terms of + the GPL version 3 or later (formerly version 2 or later) Old: ---- FileZilla_3.70.0.1_src.tar.xz New: ---- FileZilla_3.70.4_src.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ filezilla.spec ++++++ --- /var/tmp/diff_new_pack.o07Tv7/_old 2026-05-05 15:18:11.390093856 +0200 +++ /var/tmp/diff_new_pack.o07Tv7/_new 2026-05-05 15:18:11.394094022 +0200 @@ -16,18 +16,19 @@ # -%define libversion 3.70.0 -%define libfilezillaversion 0.55.0 +%define libversion 3.70.4 +%define libfilezillaversion 0.55.4 +%define libfzsshversion 1.2.0 Name: filezilla -Version: 3.70.0 +Version: 3.70.4 Release: 0 Summary: A GUI FTP and SFTP Client License: GPL-2.0-or-later Group: Productivity/Networking/Ftp/Clients URL: https://filezilla-project.org/ #Source0: https://download.filezilla-project.org/client/FileZilla_%%{version}_src.tar.xz -Source0: FileZilla_%{version}.1_src.tar.xz +Source0: FileZilla_%{version}_src.tar.xz Patch0: %{name}-welcome_dialog.patch BuildRequires: autoconf BuildRequires: automake @@ -64,7 +65,7 @@ BuildRequires: pkgconfig(gnutls) >= 3.8.3 %endif -BuildRequires: pkgconfig(libfzssh-client) >= 1.1.5 +BuildRequires: pkgconfig(libfzssh-client) >= %{libfzsshversion} %description FileZilla is a modern and powerful FTP client. ++++++ FileZilla_3.70.0.1_src.tar.xz -> FileZilla_3.70.4_src.tar.xz ++++++ ++++ 2062 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/NEWS new/filezilla-3.70.4/NEWS --- old/filezilla-3.70.0/NEWS 2026-04-09 18:32:30.000000000 +0200 +++ new/filezilla-3.70.4/NEWS 2026-04-16 15:59:31.000000000 +0200 @@ -10,6 +10,26 @@ *nix: Unix (e.g BSD) and Unix-like systems (e.g. Linux) macOS/OS X: Apple macOS +3.70.4 (2026-04-16) + +- Updated to libfilezilla 0.55.4 to address a crash +- SFTP: Updated to fzssh 1.2.0 + +3.70.3 (2026-04-14) + +- SFTP: Added a heuristic to reply to a keyboard-interactive request with the site's password, if it consists of a single prompt named "Password" +- SFTP: Updated to fzssh 1.1.10 for increased compatibility with broken servers that blatantly violate the SSH specifications + +3.70.2 (2026-04-14) + +- SFTP: Updated to fzssh 1.1.9 to address an issue with servers sending nonsensical SSH_MSG_USERAUTH_INFO_REQUEST packages + +3.70.1 (2026-04-13) + +- SFTP: Updated to fzssh 1.1.8 to address an issue with servers sending empty longnames +- SFTP: Updated to fzssh 1.1.8 to address an issue with servers incapable of handling large receive windows of 2^32 - 1 bytes +- SFTP: Fixed an issue creating directories during file upload + 3.70.0 (2026-04-09) - Replacing of invalid characters in filenames when downloading can no longer be disabled diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/configure.ac new/filezilla-3.70.4/configure.ac --- old/filezilla-3.70.0/configure.ac 2026-04-09 16:00:49.000000000 +0200 +++ new/filezilla-3.70.4/configure.ac 2026-04-16 15:59:31.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT([FileZilla],[3.70.0],[[email protected]],[],[https://filezilla-project.org/]) +AC_INIT([FileZilla],[3.70.4],[[email protected]],[],[https://filezilla-project.org/]) ENGINE_VERSION="$PACKAGE_VERSION" @@ -196,7 +196,7 @@ # Find fzssh # ----------------- - PKG_CHECK_MODULES(LIBFZSSH, [libfzssh-client >= 1.1.5],, [ + PKG_CHECK_MODULES(LIBFZSSH, [libfzssh-client >= 1.1.9],, [ AC_MSG_ERROR([libfzssh-client not found: $LIBFZSSH_PKG_ERRORS. You can download it from https://fzssh.filezilla-project.org/]) ]) AC_SUBST(LIBFZSSH_CFLAGS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/commonui/login_manager.h new/filezilla-3.70.4/src/commonui/login_manager.h --- old/filezilla-3.70.0/src/commonui/login_manager.h 2026-03-10 05:30:02.000000000 +0100 +++ new/filezilla-3.70.4/src/commonui/login_manager.h 2026-04-14 00:15:31.000000000 +0200 @@ -12,6 +12,7 @@ #include <map> #include <list> +#include <optional> #include <string> #include <vector> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/controlsocket.cpp new/filezilla-3.70.4/src/engine/controlsocket.cpp --- old/filezilla-3.70.0/src/engine/controlsocket.cpp 2026-03-24 10:36:01.000000000 +0100 +++ new/filezilla-3.70.4/src/engine/controlsocket.cpp 2026-04-13 17:22:00.000000000 +0200 @@ -310,6 +310,24 @@ return currentServer_; } +CServerPath CControlSocket::ParsePath(std::wstring reply) +{ + if (reply.empty()) { + log(logmsg::error, _("Server returned empty path.")); + return {}; + } + + CServerPath ret = currentPath_; + ret.SetType(currentServer_.GetType()); + + if (!ret.SetPath(reply)) { + log(logmsg::error, _("Failed to parse returned path.")); + return {}; + } + + return ret; +} + bool CControlSocket::ParsePwdReply(std::wstring reply, CServerPath const& defaultPath, bool quoted) { if (quoted) { @@ -344,21 +362,14 @@ } } - currentPath_.SetType(currentServer_.GetType()); - if (reply.empty() || !currentPath_.SetPath(reply)) { - if (reply.empty()) { - log(logmsg::error, _("Server returned empty path.")); - } - else { - log(logmsg::error, _("Failed to parse returned path.")); + currentPath_ = ParsePath(reply); + if (currentPath_.empty()) { + if (defaultPath.empty()) { + return false; } - if (!defaultPath.empty()) { - log(logmsg::debug_warning, L"Assuming path is '%s'.", defaultPath.GetPath()); - currentPath_ = defaultPath; - return true; - } - return false; + log(logmsg::debug_warning, L"Assuming path is '%s'.", defaultPath.GetPath()); + currentPath_ = defaultPath; } return true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/controlsocket.h new/filezilla-3.70.4/src/engine/controlsocket.h --- old/filezilla-3.70.0/src/engine/controlsocket.h 2026-03-10 05:30:02.000000000 +0100 +++ new/filezilla-3.70.4/src/engine/controlsocket.h 2026-04-13 17:22:00.000000000 +0200 @@ -312,6 +312,7 @@ int CheckOverwriteFile(); + CServerPath ParsePath(std::wstring reply); bool ParsePwdReply(std::wstring reply, const CServerPath& defaultPath = CServerPath(), bool quoted = true); virtual void Push(std::unique_ptr<COpData> && pNewOpData); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/directorylistingparser.cpp new/filezilla-3.70.4/src/engine/directorylistingparser.cpp --- old/filezilla-3.70.0/src/engine/directorylistingparser.cpp 2026-04-08 13:19:29.000000000 +0200 +++ new/filezilla-3.70.4/src/engine/directorylistingparser.cpp 2026-04-14 17:20:18.000000000 +0200 @@ -786,6 +786,9 @@ if (!override->time.empty()) { entry.time = override->time; } + if (!(override->flags & CDirentry::flag_unsure)) { + entry.flags = override->flags; + } if (!entry.is_dir() && override->size != -1) { entry.size = override->size; } @@ -803,8 +806,9 @@ if (serverType == VMS && entry.is_dir()) { // Trim version information from directories auto pos = entry.name.rfind(';'); - if (pos != std::wstring::npos && pos > 0) + if (pos != std::wstring::npos && pos > 0) { entry.name = entry.name.substr(0, pos); + } } { @@ -2074,16 +2078,26 @@ return ParseData(true); } -bool CDirectoryListingParser::AddLine(std::wstring && line, std::wstring && name, fz::datetime const& time, std::optional<uint64_t> const& size) +bool CDirectoryListingParser::AddLine(std::wstring && line, std::wstring && name, fz::datetime const& time, std::optional<uint64_t> const& size, std::optional<int> flags) { + if (line.empty() && name.empty()) { + return true; + } + if (m_pControlSocket) { - m_pControlSocket->log_raw(logmsg::listing, line); + m_pControlSocket->log_raw(logmsg::listing, line.empty() ? name : line); } CDirentry override; override.name = std::move(name); override.time = time; override.size = size ? *size : -1; + if (flags) { + override.flags = *flags; + } + else { + override.flags = CDirentry::flag_unsure; + } CLine l(std::move(line)); ParseLine(l, m_server.GetType(), true, &override); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/directorylistingparser.h new/filezilla-3.70.4/src/engine/directorylistingparser.h --- old/filezilla-3.70.0/src/engine/directorylistingparser.h 2026-04-08 13:19:29.000000000 +0200 +++ new/filezilla-3.70.4/src/engine/directorylistingparser.h 2026-04-14 17:20:18.000000000 +0200 @@ -158,7 +158,7 @@ fz::buffer& GetInputBuffer() { return inbuf_; } bool ProcessAddedData(); - bool AddLine(std::wstring && line, std::wstring && name, fz::datetime const& time, std::optional<uint64_t> const& size); + bool AddLine(std::wstring && line, std::wstring && name, fz::datetime const& time, std::optional<uint64_t> const& size, std::optional<int> flags); void Reset(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/ftp/ftpcontrolsocket.cpp new/filezilla-3.70.4/src/engine/ftp/ftpcontrolsocket.cpp --- old/filezilla-3.70.0/src/engine/ftp/ftpcontrolsocket.cpp 2026-03-10 05:30:02.000000000 +0100 +++ new/filezilla-3.70.4/src/engine/ftp/ftpcontrolsocket.cpp 2026-04-14 00:15:31.000000000 +0200 @@ -501,11 +501,11 @@ } CInteractiveLoginNotification *pInteractiveLoginNotification = static_cast<CInteractiveLoginNotification *>(pNotification); - if (pInteractiveLoginNotification->responses_.size() != 1) { + if (!pInteractiveLoginNotification->responses_ || pInteractiveLoginNotification->responses_->size() != 1) { ResetOperation(FZ_REPLY_CANCELED); return false; } - credentials_.SetPass(fz::to_wstring_from_utf8(pInteractiveLoginNotification->responses_[0])); + credentials_.SetPass(fz::to_wstring_from_utf8((*pInteractiveLoginNotification->responses_)[0])); SendNextCommand(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/server.cpp new/filezilla-3.70.4/src/engine/server.cpp --- old/filezilla-3.70.0/src/engine/server.cpp 2026-03-03 05:30:02.000000000 +0100 +++ new/filezilla-3.70.4/src/engine/server.cpp 2026-04-13 17:22:00.000000000 +0200 @@ -584,6 +584,10 @@ } break; case ProtocolFeature::ServerType: + if (protocol == FTP || protocol == FTPS || protocol == FTPES || protocol == INSECURE_FTP) { + return true; + } + break; case ProtocolFeature::UnixChmod: if (protocol == FTP || protocol == FTPS || protocol == FTPES || protocol == INSECURE_FTP || protocol == SFTP) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/sftp/connect.cpp new/filezilla-3.70.4/src/engine/sftp/connect.cpp --- old/filezilla-3.70.0/src/engine/sftp/connect.cpp 2026-04-09 05:30:02.000000000 +0200 +++ new/filezilla-3.70.4/src/engine/sftp/connect.cpp 2026-04-15 17:16:34.000000000 +0200 @@ -40,7 +40,7 @@ case sftpConnectStates::connection: { fz::ssh::client_parameters params; - params.kex_ += "diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha1"sv; + params.kex_ += ",diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha1"sv; params.cipher_ += ",aes256-cbc,aes192-cbc,aes128-cbc"sv; params.hostkey_signatures_ += ",ssh-rsa"sv; params.single_channel_ = true; @@ -129,6 +129,7 @@ if (key.pubkey_) { tried_key_ = true; used_keys_.emplace(key.pubkey_->pubkey_blob()); + log(logmsg::command, _("Authenticating with public key")); controlSocket_.ssh_->auth_with_key(key.pubkey_); return true; } @@ -151,13 +152,22 @@ methods_ = methods; if (!is_continuation) { - if (tried_key_ && !keys_.empty()) { - keys_.pop_back(); - if (!keys_.empty()) { - log(logmsg::debug_info, L"Starting over authentication with next available public key"); - tried_pw_ = tried_key_ = tried_interactive_ = false; + if (tried_key_ || tried_pw_ || tried_interactive_) { + log(logmsg::reply, _("Authentication failed")); + if (tried_key_ && !keys_.empty()) { + keys_.pop_back(); + if (!keys_.empty()) { + log(logmsg::debug_info, L"Starting over authentication with next available public key"); + tried_pw_ = tried_key_ = tried_interactive_ = false; + } } } + else { + log(logmsg::reply, _("Authentication required")); + } + } + else { + log(logmsg::reply, _("Further authentication required")); } next_auth(); @@ -202,11 +212,16 @@ { controlSocket_.SetAlive(); - log(logmsg::reply, _("Authentication successful, requesting SFTP subsystem")); + log(logmsg::reply, _("Authentication successful")); + log(logmsg::command, _("Requesting SFTP subsystem")); auto si = controlSocket_.ssh_->open_channel(fz::ssh::channel_type::subsystem, "sftp"sv); sftp_ = std::make_unique<fz::ssh::sftp::sftp_client>(std::move(si), controlSocket_, controlSocket_.logger_); +} +void CSftpConnectOpData::on_sftp_ready(fz::ssh::sftp::sftp_client*) +{ + log(logmsg::reply, _("SFTP subsystem initialized")); trigger_reset(FZ_REPLY_OK); } @@ -345,6 +360,24 @@ return; } + if (controlSocket_.credentials_.logonType_ != LogonType::interactive && prompts.size() == 1 && !controlSocket_.credentials_.GetPass().empty() && fz::equal_insensitive_ascii(fz::trimmed(prompts[0].prompt_, " \r\n\t:"sv), "password"sv)) { + if (tried_pw_) { + log(logmsg::status, _("The server sent a single keyboard-interactive prompt named \"Password\", but we already have sent the password. Select interactive login type to force an interactive prompt.")); + log(logmsg::error, fztranslate("No more authentication methods available")); + trigger_reset(FZ_REPLY_CRITICALERROR | FZ_REPLY_DISCONNECTED | FZ_REPLY_PASSWORDFAILED); + } + else { + tried_pw_ = true; + log(logmsg::status, _("The server does not support password authentication, but sent a single keyboard-interactive prompt named \"Password\". Sending password as response. Select interactive login type to force an interactive prompt.")); + log(logmsg::command, _("Sending password as response")); + + std::vector<std::string> responses; + responses.emplace_back(fz::to_utf8(controlSocket_.credentials_.GetPass())); + controlSocket_.ssh_->auth_keyboard_interactive_response(std::move(responses)); + } + return; + } + auto req = std::make_unique<CInteractiveLoginNotification>(currentServer_, controlSocket_.GetHandle()); req->name_ = name; req->instruction_ = instruction; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/sftp/connect.h new/filezilla-3.70.4/src/engine/sftp/connect.h --- old/filezilla-3.70.0/src/engine/sftp/connect.h 2026-03-10 05:30:02.000000000 +0100 +++ new/filezilla-3.70.4/src/engine/sftp/connect.h 2026-04-15 17:16:34.000000000 +0200 @@ -33,6 +33,7 @@ void on_auth_pubkey_ok(fz::ssh::session*); void on_auth_signature_failed(fz::ssh::session*); void on_auth_keyboard_interactive_prompt(fz::ssh::session*, std::string const&, std::string const&, std::vector<fz::ssh::keyboard_interactive_prompt> & prompts); + void on_sftp_ready(fz::ssh::sftp::sftp_client*); void next_auth(); bool load_keys(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/sftp/cwd.cpp new/filezilla-3.70.4/src/engine/sftp/cwd.cpp --- old/filezilla-3.70.0/src/engine/sftp/cwd.cpp 2026-04-08 14:26:02.000000000 +0200 +++ new/filezilla-3.70.4/src/engine/sftp/cwd.cpp 2026-04-13 17:22:00.000000000 +0200 @@ -97,6 +97,10 @@ } currentPath_.clear(); break; + case cwd_stat: + case cwd_stat_subdir: + sftp_->stat(this, controlSocket_.ConvToServer(target_.GetPath())); + break; } return FZ_REPLY_WOULDBLOCK; @@ -105,8 +109,13 @@ CSftpOpData::continuation CSftpChangeDirOpData::process_name(fz::ssh::sftp::entry & e, bool) { std::wstring name = controlSocket_.ConvToLocal(e.name_.data(), e.name_.size()); + if (name.empty()) { + trigger_reset(FZ_REPLY_ERROR); + return continuation::next; + } - if (name.empty() || !controlSocket_.ParsePwdReply(name, CServerPath(), false)) { + target_ = controlSocket_.ParsePath(name); + if (target_.empty()) { trigger_reset(FZ_REPLY_ERROR); return continuation::next; } @@ -147,6 +156,7 @@ switch (opState) { case cwd_stat: + currentPath_ = target_; if (!path_.empty()) { engine_.GetPathCache().Store(currentServer_, currentPath_, path_); } @@ -163,6 +173,7 @@ } break; case cwd_stat_subdir: + currentPath_ = target_; engine_.GetPathCache().Store(currentServer_, currentPath_, path_, subDir_); trigger_reset(FZ_REPLY_OK); break; @@ -183,13 +194,11 @@ break; case cwd_stat: case cwd_stat_subdir: - log(logmsg::error, _("Could not get directory information: %s"), msg); - trigger_reset(FZ_REPLY_ERROR); - break; case cwd_cwd: if (tryMkdOnFail_) { tryMkdOnFail_ = false; controlSocket_.Mkdir(path_); + trigger_next(); } else { log(logmsg::error, _("Could not get directory information: %s"), msg); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/sftp/list.cpp new/filezilla-3.70.4/src/engine/sftp/list.cpp --- old/filezilla-3.70.0/src/engine/sftp/list.cpp 2026-03-24 10:36:01.000000000 +0100 +++ new/filezilla-3.70.4/src/engine/sftp/list.cpp 2026-04-16 15:59:31.000000000 +0200 @@ -163,13 +163,23 @@ } if (!listing_parser_) { - controlSocket_.log_raw(logmsg::listing, longname); log(logmsg::debug_warning, L"listing_parser_ is null"); trigger_reset(FZ_REPLY_INTERNALERROR); return continuation::error; } - listing_parser_->AddLine(std::move(longname), std::move(name), e.modified_ ? *e.modified_ : fz::datetime(), e.size_); + std::optional<int> flags; + if (longname.empty() && e.perms_) { + flags.emplace(); + if (e.is_directory()) { + *flags |= CDirentry::flag_dir; + } + if (e.is_symlink()) { + *flags |= CDirentry::flag_link; + } + } + + listing_parser_->AddLine(std::move(longname), std::move(name), e.modified_ ? *e.modified_ : fz::datetime(), e.size_, flags); return continuation::next; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/sftp/mkd.cpp new/filezilla-3.70.4/src/engine/sftp/mkd.cpp --- old/filezilla-3.70.0/src/engine/sftp/mkd.cpp 2026-04-09 05:30:02.000000000 +0200 +++ new/filezilla-3.70.4/src/engine/sftp/mkd.cpp 2026-04-13 17:22:00.000000000 +0200 @@ -69,7 +69,7 @@ } if (paths_.size() == 1) { if (success) { - log(fz::logmsg::error, _("Directory creation succeeded."), msg); + log(fz::logmsg::status, _("Directory creation succeeded."), msg); trigger_reset(FZ_REPLY_OK); } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/sftp/sftpcontrolsocket.cpp new/filezilla-3.70.4/src/engine/sftp/sftpcontrolsocket.cpp --- old/filezilla-3.70.0/src/engine/sftp/sftpcontrolsocket.cpp 2026-03-23 18:25:03.000000000 +0100 +++ new/filezilla-3.70.4/src/engine/sftp/sftpcontrolsocket.cpp 2026-04-16 15:07:17.000000000 +0200 @@ -119,12 +119,12 @@ } auto & req = static_cast<CInteractiveLoginNotification&>(*pNotification); - if (req.responses_.empty()) { + if (!req.responses_) { DoClose(FZ_REPLY_CANCELED); return false; } - ssh_->auth_keyboard_interactive_response(req.responses_); + ssh_->auth_keyboard_interactive_response(*req.responses_); } break; case reqId_password: @@ -208,21 +208,24 @@ fz::ssh::auth_done_event, fz::ssh::auth_public_key_okay_event, fz::ssh::auth_signature_failure_event, - fz::ssh::auth_keyboard_interactive_prompt_event + fz::ssh::auth_keyboard_interactive_prompt_event, + fz::ssh::sftp::sftp_client::ready_event >( ev, op, &CSftpConnectOpData::on_auth_requested, &CSftpConnectOpData::on_auth_done, &CSftpConnectOpData::on_auth_pubkey_ok, &CSftpConnectOpData::on_auth_signature_failed, - &CSftpConnectOpData::on_auth_keyboard_interactive_prompt + &CSftpConnectOpData::on_auth_keyboard_interactive_prompt, + &CSftpConnectOpData::on_sftp_ready ); } - fz::dispatch<fz::ssh::hostkey_verification_event, fz::ssh::session_done_event>( + fz::dispatch<fz::ssh::hostkey_verification_event, fz::ssh::session_done_event, fz::ssh::sftp::sftp_client::done_event>( ev, this, &CSftpControlSocket::on_hostkey_verification, - &CSftpControlSocket::on_session_done + &CSftpControlSocket::on_session_done, + &CSftpControlSocket::on_sftp_done ); @@ -251,6 +254,11 @@ { DoClose(); } + +void CSftpControlSocket::on_sftp_done(fz::ssh::sftp::sftp_client*) +{ + DoClose(); +} void CSftpControlSocket::List(CServerPath const& path, std::wstring const& subDir, int flags) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/engine/sftp/sftpcontrolsocket.h new/filezilla-3.70.4/src/engine/sftp/sftpcontrolsocket.h --- old/filezilla-3.70.0/src/engine/sftp/sftpcontrolsocket.h 2026-03-24 10:36:01.000000000 +0100 +++ new/filezilla-3.70.4/src/engine/sftp/sftpcontrolsocket.h 2026-04-16 15:07:17.000000000 +0200 @@ -43,6 +43,7 @@ void on_hostkey_verification(fz::ssh::session*, std::unique_ptr<fz::ssh::public_key> &, fz::ssh::algorithm_info &); void on_session_done(fz::ssh::session*); + void on_sftp_done(fz::ssh::sftp::sftp_client*); std::unique_ptr<fz::ssh::client> ssh_; std::unique_ptr<fz::ssh::sftp::sftp_client> sftp_; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/include/notification.h new/filezilla-3.70.4/src/include/notification.h --- old/filezilla-3.70.0/src/include/notification.h 2026-03-10 05:30:02.000000000 +0100 +++ new/filezilla-3.70.4/src/include/notification.h 2026-04-14 00:15:31.000000000 +0200 @@ -28,6 +28,8 @@ #include <libfilezilla/time.hpp> #include <libfilezilla/tls_info.hpp> +#include <optional> + enum NotificationId : unsigned int { nId_logmsg, // notification about new messages for the message log @@ -227,7 +229,7 @@ std::string instruction_; std::vector<fz::ssh::keyboard_interactive_prompt> prompts_; - std::vector<std::string> responses_; + std::optional<std::vector<std::string>> responses_; }; class FZC_PUBLIC_SYMBOL PasswordRequest final : public CAsyncRequestNotification diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/interface/loginmanager.cpp new/filezilla-3.70.4/src/interface/loginmanager.cpp --- old/filezilla-3.70.0/src/interface/loginmanager.cpp 2026-03-31 05:30:02.000000000 +0200 +++ new/filezilla-3.70.4/src/interface/loginmanager.cpp 2026-04-14 00:15:31.000000000 +0200 @@ -183,11 +183,11 @@ return {}; } -std::vector<std::string> CLoginManager::interactive_prompt(Site const& site, std::string const& name, std::string const& instruction, fz::ssh::keyboard_interactive_prompts const& prompts) +std::optional<std::vector<std::string>> CLoginManager::interactive_prompt(Site const& site, std::string const& name, std::string const& instruction, fz::ssh::keyboard_interactive_prompts const& prompts) { wxDialogEx pwdDlg; if (!pwdDlg.Create(wxGetApp().GetTopWindow(), nullID, _("Authentication required"))) { - return {}; + return std::nullopt; } auto& lay = pwdDlg.layout(); auto* main = lay.createMain(&pwdDlg, 1); @@ -267,7 +267,7 @@ pwdDlg.GetSizer()->SetSizeHints(&pwdDlg); if (pwdDlg.ShowModal() != wxID_OK) { - return {}; + return std::nullopt; } std::vector<std::string> ret; @@ -275,7 +275,7 @@ ret.emplace_back(fz::to_utf8(r->GetValue())); } - return ret; + return std::move(ret); } bool CLoginManager::query_credentials(Site & site, bool canRemember) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/filezilla-3.70.0/src/interface/loginmanager.h new/filezilla-3.70.4/src/interface/loginmanager.h --- old/filezilla-3.70.0/src/interface/loginmanager.h 2026-03-31 05:30:02.000000000 +0200 +++ new/filezilla-3.70.4/src/interface/loginmanager.h 2026-04-14 00:15:31.000000000 +0200 @@ -16,7 +16,7 @@ bool AskDecryptor(fz::public_key const& pub, bool allowForgotten, bool allowCancel); static std::string get_topt(Site const& site); - static std::vector<std::string> interactive_prompt(Site const& site, std::string const& name, std::string const& instruction, fz::ssh::keyboard_interactive_prompts const& p); + static std::optional<std::vector<std::string>> interactive_prompt(Site const& site, std::string const& name, std::string const& instruction, fz::ssh::keyboard_interactive_prompts const& p); protected: virtual bool query_unprotect_site(Site & site) override;
