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;

Reply via email to