diff options
| author | Carl Hetherington <cth@carlh.net> | 2014-03-26 20:53:02 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2014-03-26 20:53:02 +0000 |
| commit | 4438476ea07f171ef4909f0882b490dfcfb7094c (patch) | |
| tree | dc97155b76965cf7b7b5bedf7efa2389fb94c793 /src/lib | |
| parent | 41b7a04cf3dedaa93aaf3c050db7a693281417f7 (diff) | |
Some more certificate download improvements.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/internet.cc | 148 | ||||
| -rw-r--r-- | src/lib/internet.h | 25 | ||||
| -rw-r--r-- | src/lib/wscript | 1 |
3 files changed, 174 insertions, 0 deletions
diff --git a/src/lib/internet.cc b/src/lib/internet.cc new file mode 100644 index 000000000..16fd67244 --- /dev/null +++ b/src/lib/internet.cc @@ -0,0 +1,148 @@ +/* + Copyright (C) 2014 Carl Hetherington <cth@carlh.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <string> +#include <boost/function.hpp> +#include <boost/optional.hpp> +#include <boost/filesystem.hpp> +#include <curl/curl.h> +#include <zip.h> +#include "util.h" + +#include "i18n.h" + +using std::string; +using std::stringstream; +using std::list; +using boost::optional; +using boost::function; + +static size_t +get_from_zip_url_data (void* buffer, size_t size, size_t nmemb, void* stream) +{ + FILE* f = reinterpret_cast<FILE*> (stream); + return fwrite (buffer, size, nmemb, f); +} + +/** @param url URL of ZIP file. + * @param file Filename within ZIP file. + * @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) +{ + /* Download the ZIP file to temp_zip */ + CURL* curl = curl_easy_init (); + curl_easy_setopt (curl, CURLOPT_URL, url.c_str ()); + + ScopedTemporary temp_zip; + FILE* f = temp_zip.open ("wb"); + curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, get_from_zip_url_data); + curl_easy_setopt (curl, CURLOPT_WRITEDATA, f); + + CURLcode const cr = curl_easy_perform (curl); + + temp_zip.close (); + curl_easy_cleanup (curl); + if (cr != CURLE_OK) { + return String::compose (_("Download failed (%1/%2 error %3)"), url, file, cr); + } + + /* Open the ZIP file and read `file' out of it */ + + struct zip* zip = zip_open (temp_zip.c_str(), 0, 0); + if (!zip) { + return optional<string> (_("Could not open downloaded ZIP file")); + } + + struct zip_file* zip_file = zip_fopen (zip, file.c_str(), 0); + if (!zip_file) { + return optional<string> (_("Unexpected ZIP file contents")); + } + + ScopedTemporary temp_cert; + f = temp_cert.open ("wb"); + char buffer[4096]; + while (1) { + int const N = zip_fread (zip_file, buffer, sizeof (buffer)); + fwrite (buffer, 1, N, f); + if (N < int (sizeof (buffer))) { + break; + } + } + temp_cert.close (); + + load (temp_cert.file ()); + return optional<string> (); +} + + +static size_t +ftp_ls_data (void* buffer, size_t size, size_t nmemb, void* data) +{ + string* s = reinterpret_cast<string *> (data); + uint8_t* b = reinterpret_cast<uint8_t *> (buffer); + for (size_t i = 0; i < (size * nmemb); ++i) { + *s += b[i]; + } + return nmemb; +} + +list<string> +ftp_ls (string url) +{ + CURL* curl = curl_easy_init (); + if (!curl) { + return list<string> (); + } + + if (url.substr (url.length() - 1, 1) != "/") { + url += "/"; + } + curl_easy_setopt (curl, CURLOPT_URL, url.c_str ()); + + string ls_raw; + struct curl_slist* commands = 0; + commands = curl_slist_append (commands, "NLST"); + curl_easy_setopt (curl, CURLOPT_POSTQUOTE, commands); + 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); + CURLcode const r = curl_easy_perform (curl); + if (r != CURLE_OK) { + return list<string> (); + } + + stringstream s (ls_raw); + string line; + list<string> ls; + while (s.good ()) { + getline (s, line); + if (line.length() > 55) { + string const file = line.substr (55); + if (file != "." && file != "..") { + ls.push_back (file); + } + } + } + + curl_easy_cleanup (curl); + + return ls; +} diff --git a/src/lib/internet.h b/src/lib/internet.h new file mode 100644 index 000000000..d7427fe48 --- /dev/null +++ b/src/lib/internet.h @@ -0,0 +1,25 @@ +/* + Copyright (C) 2014 Carl Hetherington <cth@carlh.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <boost/optional.hpp> +#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); +std::list<std::string> ftp_ls (std::string dir); diff --git a/src/lib/wscript b/src/lib/wscript index 7c9712ff8..a50216f6d 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -30,6 +30,7 @@ sources = """ ffmpeg_examiner.cc film.cc filter.cc + internet.cc image.cc image_content.cc image_decoder.cc |
