diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-10-17 19:23:18 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-10-17 19:23:18 +0100 |
| commit | ce9bb37168f52a8d1348e1334fc15d5778fffa75 (patch) | |
| tree | e77c65084e72290f77d5346e4020d3357403c018 /src | |
| parent | 4eaecb1841d3a80a4f06613ad4c0bd44d89285a9 (diff) | |
Prevent un-prompted overwrite of files when exporting things from config (#1383).
Diffstat (limited to 'src')
| -rw-r--r-- | src/wx/config_dialog.cc | 92 | ||||
| -rw-r--r-- | src/wx/full_config_dialog.cc | 5 | ||||
| -rw-r--r-- | src/wx/wx_util.cc | 9 | ||||
| -rw-r--r-- | src/wx/wx_util.h | 2 |
4 files changed, 66 insertions, 42 deletions
diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index 4195aa128..e55de008f 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -526,14 +526,17 @@ CertificateChainEditor::export_certificate () } if (d->ShowModal () == wxID_OK) { - FILE* f = fopen_boost (path_from_file_dialog (d, "pem"), "w"); - if (!f) { - throw OpenFileError (wx_to_std (d->GetPath ()), errno, false); - } + optional<boost::filesystem::path> path = path_from_file_dialog (d, "pem"); + if (path) { + FILE* f = fopen_boost (*path, "w"); + if (!f) { + throw OpenFileError (*path, errno, false); + } - string const s = j->certificate (true); - fwrite (s.c_str(), 1, s.length(), f); - fclose (f); + string const s = j->certificate (true); + fwrite (s.c_str(), 1, s.length(), f); + fclose (f); + } } d->Destroy (); } @@ -698,14 +701,17 @@ CertificateChainEditor::export_private_key () ); if (d->ShowModal () == wxID_OK) { - FILE* f = fopen_boost (path_from_file_dialog (d, "pem"), "w"); - if (!f) { - throw OpenFileError (wx_to_std (d->GetPath ()), errno, false); - } + optional<boost::filesystem::path> path = path_from_file_dialog (d, "pem"); + if (path) { + FILE* f = fopen_boost (*path, "w"); + if (!f) { + throw OpenFileError (*path, errno, false); + } - string const s = _get()->key().get (); - fwrite (s.c_str(), 1, s.length(), f); - fclose (f); + string const s = _get()->key().get (); + fwrite (s.c_str(), 1, s.length(), f); + fclose (f); + } } d->Destroy (); } @@ -793,17 +799,20 @@ KeysPage::export_decryption_chain_and_key () ); if (d->ShowModal () == wxID_OK) { - FILE* f = fopen_boost (path_from_file_dialog (d, "dom"), "w"); - if (!f) { - throw OpenFileError (wx_to_std (d->GetPath ()), errno, false); - } + optional<boost::filesystem::path> path = path_from_file_dialog (d, "dom"); + if (path) { + FILE* f = fopen_boost (*path, "w"); + if (!f) { + throw OpenFileError (wx_to_std (d->GetPath ()), errno, false); + } - string const chain = Config::instance()->decryption_chain()->chain(); - fwrite (chain.c_str(), 1, chain.length(), f); - optional<string> const key = Config::instance()->decryption_chain()->key(); - DCPOMATIC_ASSERT (key); - fwrite (key->c_str(), 1, key->length(), f); - fclose (f); + string const chain = Config::instance()->decryption_chain()->chain(); + fwrite (chain.c_str(), 1, chain.length(), f); + optional<string> const key = Config::instance()->decryption_chain()->key(); + DCPOMATIC_ASSERT (key); + fwrite (key->c_str(), 1, key->length(), f); + fclose (f); + } } d->Destroy (); @@ -870,14 +879,17 @@ KeysPage::export_decryption_chain () ); if (d->ShowModal () == wxID_OK) { - FILE* f = fopen_boost (path_from_file_dialog (d, "pem"), "w"); - if (!f) { - throw OpenFileError (wx_to_std (d->GetPath ()), errno, false); - } + optional<boost::filesystem::path> path = path_from_file_dialog (d, "pem"); + if (path) { + FILE* f = fopen_boost (*path, "w"); + if (!f) { + throw OpenFileError (*path, errno, false); + } - string const s = Config::instance()->decryption_chain()->chain(); - fwrite (s.c_str(), 1, s.length(), f); - fclose (f); + string const s = Config::instance()->decryption_chain()->chain(); + fwrite (s.c_str(), 1, s.length(), f); + fclose (f); + } } d->Destroy (); } @@ -891,14 +903,18 @@ KeysPage::export_decryption_certificate () ); if (d->ShowModal () == wxID_OK) { - FILE* f = fopen_boost (path_from_file_dialog (d, "pem"), "w"); - if (!f) { - throw OpenFileError (wx_to_std (d->GetPath ()), errno, false); - } + optional<boost::filesystem::path> path = path_from_file_dialog (d, "pem"); + if (path) { + FILE* f = fopen_boost (*path, "w"); + if (!f) { + throw OpenFileError (*path, errno, false); + } - string const s = Config::instance()->decryption_chain()->leaf().certificate (true); - fwrite (s.c_str(), 1, s.length(), f); - fclose (f); + string const s = Config::instance()->decryption_chain()->leaf().certificate (true); + fwrite (s.c_str(), 1, s.length(), f); + fclose (f); + } } + d->Destroy (); } diff --git a/src/wx/full_config_dialog.cc b/src/wx/full_config_dialog.cc index bb4f43bea..974635a8b 100644 --- a/src/wx/full_config_dialog.cc +++ b/src/wx/full_config_dialog.cc @@ -196,7 +196,10 @@ private: ); if (d->ShowModal () == wxID_OK) { - boost::filesystem::copy_file (Config::instance()->cinemas_file(), path_from_file_dialog (d, "xml")); + optional<boost::filesystem::path> path = path_from_file_dialog (d, "xml"); + if (path) { + boost::filesystem::copy_file (Config::instance()->cinemas_file(), *path); + } } d->Destroy (); } diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc index c9185ec97..db6340031 100644 --- a/src/wx/wx_util.cc +++ b/src/wx/wx_util.cc @@ -463,10 +463,15 @@ maybe_show_splash () return splash; } -boost::filesystem::path +optional<boost::filesystem::path> path_from_file_dialog (wxFileDialog* dialog, string extension) { - return boost::filesystem::path(wx_to_std(dialog->GetPath())).replace_extension(extension); + boost::filesystem::path p(wx_to_std(dialog->GetPath())); + p.replace_extension(extension); + if (boost::filesystem::is_regular_file(p) && !confirm_dialog(dialog, wxString::Format(_("A file named %s already exists. Do you want to replace it?"), std_to_wx(p.filename().string())))) { + return optional<boost::filesystem::path>(); + } + return p; } double diff --git a/src/wx/wx_util.h b/src/wx/wx_util.h index 1acca044a..ee06c3807 100644 --- a/src/wx/wx_util.h +++ b/src/wx/wx_util.h @@ -86,7 +86,7 @@ extern std::string string_client_data (wxClientData* o); extern wxString time_to_timecode (DCPTime t, double fps); extern void setup_audio_channels_choice (wxChoice* choice, int minimum); extern wxSplashScreen* maybe_show_splash (); -extern boost::filesystem::path path_from_file_dialog (wxFileDialog* dialog, std::string extension); +extern boost::optional<boost::filesystem::path> path_from_file_dialog (wxFileDialog* dialog, std::string extension); extern double calculate_mark_interval (double start); extern void checked_set (FilePickerCtrl* widget, boost::filesystem::path value); |
