From 0d7d4fb3472a30f7706baab0703114ec32d5a2af Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 1 Nov 2022 20:58:10 +0100 Subject: [PATCH] Add passive mode option to TMS upload. Disabling this fixes TMS upload with some FTP servers (reported on a Synology NAS). --- src/lib/config.cc | 4 ++++ src/lib/config.h | 9 +++++++++ src/lib/curl_uploader.cc | 3 +++ src/wx/full_config_dialog.cc | 15 +++++++++++++++ 4 files changed, 31 insertions(+) diff --git a/src/lib/config.cc b/src/lib/config.cc index 81daff5b6..6984c4064 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -94,6 +94,7 @@ Config::set_defaults () _servers.clear (); _only_servers_encode = false; _tms_protocol = FileTransferProtocol::SCP; + _tms_passive = true; _tms_ip = ""; _tms_path = "."; _tms_user = ""; @@ -325,6 +326,7 @@ try _only_servers_encode = f.optional_bool_child ("OnlyServersEncode").get_value_or (false); _tms_protocol = static_cast(f.optional_number_child("TMSProtocol").get_value_or(static_cast(FileTransferProtocol::SCP))); + _tms_passive = f.optional_bool_child("TMSPassive").get_value_or(true); _tms_ip = f.string_child ("TMSIP"); _tms_path = f.string_child ("TMSPath"); _tms_user = f.string_child ("TMSUser"); @@ -719,6 +721,8 @@ Config::write_config () const root->add_child("OnlyServersEncode")->add_child_text (_only_servers_encode ? "1" : "0"); /* [XML] TMSProtocol Protocol to use to copy files to a TMS; 0 to use SCP, 1 for FTP. */ root->add_child("TMSProtocol")->add_child_text (raw_convert (static_cast (_tms_protocol))); + /* [XML] TMSPassive True to use PASV mode with TMS FTP connections. */ + root->add_child("TMSPassive")->add_child_text(_tms_passive ? "1" : "0"); /* [XML] TMSIP IP address of TMS. */ root->add_child("TMSIP")->add_child_text (_tms_ip); /* [XML] TMSPath Path on the TMS to copy files to. */ diff --git a/src/lib/config.h b/src/lib/config.h index 1a11b4a41..9e84a120b 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -130,6 +130,10 @@ public: return _tms_protocol; } + bool tms_passive() const { + return _tms_passive; + } + /** @return The IP address of a TMS that we can copy DCPs to */ std::string tms_ip () const { return _tms_ip; @@ -629,6 +633,10 @@ public: maybe_set (_tms_protocol, p); } + void set_tms_passive(bool passive) { + maybe_set(_tms_passive, passive); + } + /** @param i IP address of a TMS that we can copy DCPs to */ void set_tms_ip (std::string i) { maybe_set (_tms_ip, i); @@ -1256,6 +1264,7 @@ private: std::vector _servers; bool _only_servers_encode; FileTransferProtocol _tms_protocol; + bool _tms_passive; /** The IP address of a TMS that we can copy DCPs to */ std::string _tms_ip; /** The path on a TMS that we should write DCPs to */ diff --git a/src/lib/curl_uploader.cc b/src/lib/curl_uploader.cc index 6fe7aba14..9416a17fb 100644 --- a/src/lib/curl_uploader.cc +++ b/src/lib/curl_uploader.cc @@ -58,6 +58,9 @@ CurlUploader::CurlUploader (function set_status, functiontms_user().c_str()); curl_easy_setopt (_curl, CURLOPT_PASSWORD, Config::instance()->tms_password().c_str()); + if (!Config::instance()->tms_passive()) { + curl_easy_setopt(_curl, CURLOPT_FTPPORT, "-"); + } } diff --git a/src/wx/full_config_dialog.cc b/src/wx/full_config_dialog.cc index 1aeacd3ca..1eb87d93e 100644 --- a/src/wx/full_config_dialog.cc +++ b/src/wx/full_config_dialog.cc @@ -696,6 +696,10 @@ private: _tms_protocol = new wxChoice (_panel, wxID_ANY); table->Add (_tms_protocol, 1, wxEXPAND); + _tms_passive = new CheckBox(_panel, _("Passive mode")); + table->Add(_tms_passive, 1, wxEXPAND); + table->AddSpacer(0); + add_label_to_sizer (table, _panel, _("IP address"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); _tms_ip = new wxTextCtrl (_panel, wxID_ANY); table->Add (_tms_ip, 1, wxEXPAND); @@ -717,6 +721,8 @@ private: _upload->Bind (wxEVT_CHECKBOX, boost::bind(&TMSPage::upload_changed, this)); _tms_protocol->Bind (wxEVT_CHOICE, boost::bind (&TMSPage::tms_protocol_changed, this)); + _tms_passive->bind(&TMSPage::tms_passive_changed, this); + _tms_ip->Bind (wxEVT_TEXT, boost::bind (&TMSPage::tms_ip_changed, this)); _tms_path->Bind (wxEVT_TEXT, boost::bind (&TMSPage::tms_path_changed, this)); _tms_user->Bind (wxEVT_TEXT, boost::bind (&TMSPage::tms_user_changed, this)); @@ -729,10 +735,13 @@ private: checked_set (_upload, config->upload_after_make_dcp()); checked_set (_tms_protocol, static_cast(config->tms_protocol())); + checked_set(_tms_passive, config->tms_protocol() == FileTransferProtocol::FTP && config->tms_passive()); checked_set (_tms_ip, config->tms_ip ()); checked_set (_tms_path, config->tms_path ()); checked_set (_tms_user, config->tms_user ()); checked_set (_tms_password, config->tms_password ()); + + _tms_passive->Enable(config->tms_protocol() == FileTransferProtocol::FTP); } void upload_changed () @@ -745,6 +754,11 @@ private: Config::instance()->set_tms_protocol(static_cast(_tms_protocol->GetSelection())); } + void tms_passive_changed() + { + Config::instance()->set_tms_passive(_tms_passive->get()); + } + void tms_ip_changed () { Config::instance()->set_tms_ip (wx_to_std (_tms_ip->GetValue ())); @@ -766,6 +780,7 @@ private: } CheckBox* _upload; + CheckBox* _tms_passive; wxChoice* _tms_protocol; wxTextCtrl* _tms_ip; wxTextCtrl* _tms_path; -- 2.30.2