Specify no EPRT on FTP downloads. Fix request to CURL when not
authorCarl Hetherington <cth@carlh.net>
Wed, 2 Dec 2015 10:29:29 +0000 (10:29 +0000)
committerCarl Hetherington <cth@carlh.net>
Wed, 2 Dec 2015 10:29:29 +0000 (10:29 +0000)
using PASV.  Fix incorrect return value from ftp_ls_data.
Tidy Dolby fetching code a bit.  Fix sensitivity of Dolby
download button (#769).

ChangeLog
src/lib/internet.cc
src/lib/internet.h
src/wx/dolby_certificate_panel.cc
src/wx/dolby_certificate_panel.h
src/wx/doremi_certificate_panel.cc

index 5b70592da9ce42db51a731b5f1a99c2123fb48f2..62b4a631a033a2f47e2ec5f8dd2b782056af6ff7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2015-12-02  Carl Hetherington  <cth@carlh.net>
 
+       * Various fixes to certificate downloading.
+
        * Version 2.5.13 released.
 
 2015-12-02  Carl Hetherington  <cth@carlh.net>
index 2b1e90ca7c030366652ec38cb625bc3cd0798ac9..1aaeccd36d1c9d64119f7871cd23134ea2c71d7b 100644 (file)
@@ -49,7 +49,7 @@ get_from_zip_url_data (void* buffer, size_t size, size_t nmemb, void* stream)
  *  @param load Function passed a (temporary) filesystem path of the unpacked file.
  */
 optional<string>
-get_from_zip_url (string url, string file, function<void (boost::filesystem::path)> load)
+get_from_zip_url (string url, string file, bool pasv, function<void (boost::filesystem::path)> load)
 {
        /* Download the ZIP file to temp_zip */
        CURL* curl = curl_easy_init ();
@@ -60,6 +60,11 @@ get_from_zip_url (string url, string file, function<void (boost::filesystem::pat
        curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, get_from_zip_url_data);
        curl_easy_setopt (curl, CURLOPT_WRITEDATA, f);
        curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0);
+       curl_easy_setopt (curl, CURLOPT_FTP_USE_EPRT, 0);
+       if (!pasv) {
+               curl_easy_setopt (curl, CURLOPT_FTPPORT, "-");
+       }
+
        /* Maximum time is 20s */
        curl_easy_setopt (curl, CURLOPT_TIMEOUT, 20);
 
@@ -99,7 +104,6 @@ get_from_zip_url (string url, string file, function<void (boost::filesystem::pat
        return optional<string> ();
 }
 
-
 static size_t
 ftp_ls_data (void* buffer, size_t size, size_t nmemb, void* data)
 {
@@ -108,7 +112,7 @@ ftp_ls_data (void* buffer, size_t size, size_t nmemb, void* data)
        for (size_t i = 0; i < (size * nmemb); ++i) {
                *s += b[i];
        }
-       return nmemb;
+       return size * nmemb;
 }
 
 list<string>
@@ -133,8 +137,10 @@ ftp_ls (string url, bool pasv)
        curl_easy_setopt (curl, CURLOPT_WRITEDATA, &ls_raw);
        curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, ftp_ls_data);
        curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0);
+       curl_easy_setopt (curl, CURLOPT_FTP_USE_EPRT, 0);
+       curl_easy_setopt (curl, CURLOPT_VERBOSE, 1);
        if (!pasv) {
-               curl_easy_setopt (curl, CURLOPT_FTPPORT, "");
+               curl_easy_setopt (curl, CURLOPT_FTPPORT, "-");
        }
        CURLcode const r = curl_easy_perform (curl);
        if (r != CURLE_OK) {
index f46abc367de128780a87c390142e73587d4532a1..12b2ba3cd6999290ab8f8037d5fc83bea3505cbf 100644 (file)
@@ -21,5 +21,5 @@
 #include <boost/function.hpp>
 #include <boost/filesystem.hpp>
 
-boost::optional<std::string> get_from_zip_url (std::string url, std::string file, boost::function<void (boost::filesystem::path)> load);
+boost::optional<std::string> get_from_zip_url (std::string url, std::string file, bool pasv, boost::function<void (boost::filesystem::path)> load);
 std::list<std::string> ftp_ls (std::string dir, bool pasv = true);
index 7e6404cfb67ece29e946f2aa83ea776919e2b410..45d52eca2fc13464045af600d9844d32e0f4154e 100644 (file)
@@ -64,11 +64,16 @@ DolbyCertificatePanel::DolbyCertificatePanel (wxWindow* parent, DownloadCertific
        _cinema->Clear ();
 }
 
+string
+DolbyCertificatePanel::url (string path) const
+{
+       return String::compose ("ftp://dolbyrootcertificates:houro61l@ftp.dolby.co.uk/SHA256/%1", path);
+}
+
 list<string>
 DolbyCertificatePanel::get_dir (string dir) const
 {
-       string url = String::compose ("ftp://dolbyrootcertificates:houro61l@ftp.dolby.co.uk/SHA256/%1", dir);
-       return ftp_ls (url, false);
+       return ftp_ls (url (dir), false);
 }
 
 void
@@ -180,11 +185,12 @@ DolbyCertificatePanel::finish_download (wxStaticText* message)
 {
        string const zip = string_client_data (_serial->GetClientObject (_serial->GetSelection ()));
 
-       string const file = String::compose (
-               "ftp://dolbyrootcertificates:houro61l@ftp.dolby.co.uk/SHA256/%1/%2/%3",
-               wx_to_std (_country->GetStringSelection()),
-               wx_to_std (_cinema->GetStringSelection()),
-               zip
+       string const file = url (
+               String::compose ("%1/%2/%3",
+                                wx_to_std (_country->GetStringSelection()),
+                                wx_to_std (_cinema->GetStringSelection()),
+                                zip
+                       )
                );
 
        /* Work out the certificate file name inside the zip */
@@ -196,7 +202,7 @@ DolbyCertificatePanel::finish_download (wxStaticText* message)
        }
        string const cert = b[0] + "_" + b[1] + ".pem.crt";
 
-       optional<string> error = get_from_zip_url (file, cert, boost::bind (&DownloadCertificatePanel::load, this, _1));
+       optional<string> error = get_from_zip_url (file, cert, false, boost::bind (&DownloadCertificatePanel::load, this, _1));
        if (error) {
                message->SetLabel (std_to_wx (error.get ()));
        } else {
@@ -208,8 +214,7 @@ DolbyCertificatePanel::finish_download (wxStaticText* message)
 bool
 DolbyCertificatePanel::ready_to_download () const
 {
-       /* XXX */
-       return false;
+       return _country->GetSelection() != -1 && _cinema->GetSelection() != -1 && _serial->GetSelection() != -1;
 }
 
 void
index 1ac47ae76aa5b367373b9dc01788a850238ae80f..c004a77177b1e8ae055b8c5db523c9aacf769083 100644 (file)
@@ -38,6 +38,7 @@ private:
        void finish_country_selected ();
        void cinema_selected ();
        void finish_cinema_selected ();
+       std::string url (std::string path) const;
        std::list<std::string> get_dir (std::string) const;
 
        wxChoice* _country;
index 4d98b09ea28c872ccbd21d7a5b83026ce4f44ee1..bdc0b037789f8f51c75312a3a28e364fd6fe181e 100644 (file)
@@ -71,6 +71,7 @@ DoremiCertificatePanel::finish_download (string serial, wxStaticText* message)
                        serial.substr(0, 3), serial
                        ),
                String::compose ("dcp2000-%1.cert.sha256.pem", serial),
+               true,
                boost::bind (&DownloadCertificatePanel::load, this, _1)
                );
 
@@ -82,6 +83,7 @@ DoremiCertificatePanel::finish_download (string serial, wxStaticText* message)
                        serial.substr(0, 3), serial
                        ),
                String::compose ("dcp2000-%1.cert.sha256.pem", serial),
+               true,
                boost::bind (&DownloadCertificatePanel::load, this, _1)
                );
        }
@@ -94,6 +96,7 @@ DoremiCertificatePanel::finish_download (string serial, wxStaticText* message)
                        serial.substr(0, 3), serial
                        ),
                String::compose ("imb-%1.cert.sha256.pem", serial),
+               true,
                boost::bind (&DownloadCertificatePanel::load, this, _1)
                );
        }
@@ -106,6 +109,7 @@ DoremiCertificatePanel::finish_download (string serial, wxStaticText* message)
                        serial.substr(0, 3), serial
                        ),
                String::compose ("ims-%1.cert.sha256.pem", serial),
+               true,
                boost::bind (&DownloadCertificatePanel::load, this, _1)
                );
        }