summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-10-17 19:23:18 +0100
committerCarl Hetherington <cth@carlh.net>2018-10-17 19:23:18 +0100
commitce9bb37168f52a8d1348e1334fc15d5778fffa75 (patch)
treee77c65084e72290f77d5346e4020d3357403c018 /src
parent4eaecb1841d3a80a4f06613ad4c0bd44d89285a9 (diff)
Prevent un-prompted overwrite of files when exporting things from config (#1383).
Diffstat (limited to 'src')
-rw-r--r--src/wx/config_dialog.cc92
-rw-r--r--src/wx/full_config_dialog.cc5
-rw-r--r--src/wx/wx_util.cc9
-rw-r--r--src/wx/wx_util.h2
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);