From 83416808c0b1ca732e7a186d3811f1ec796fea08 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 21 May 2020 00:05:50 +0200 Subject: [PATCH] Give 'wrong target' KDM errors in a dialogue box rather than in the job manager (part of #1161). --- src/lib/dcp.cc | 26 +------------------------- src/lib/dcp.h | 1 - src/lib/util.cc | 27 +++++++++++++++++++++++++++ src/lib/util.h | 2 ++ src/wx/content_menu.cc | 13 ++++++++++++- 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/lib/dcp.cc b/src/lib/dcp.cc index 477b61e9f..2f56a4ee7 100644 --- a/src/lib/dcp.cc +++ b/src/lib/dcp.cc @@ -37,30 +37,6 @@ using std::string; using boost::shared_ptr; using boost::dynamic_pointer_cast; -dcp::DecryptedKDM -DCP::decrypted_kdm () const -{ - try { - return dcp::DecryptedKDM (_dcp_content->kdm().get(), Config::instance()->decryption_chain()->key().get()); - } catch (dcp::KDMDecryptionError& e) { - /* Try to flesh out the error a bit */ - string const kdm_subject_name = _dcp_content->kdm()->recipient_x509_subject_name(); - bool on_chain = false; - shared_ptr dc = Config::instance()->decryption_chain(); - BOOST_FOREACH (dcp::Certificate i, dc->root_to_leaf()) { - if (i.subject() == kdm_subject_name) { - on_chain = true; - } - } - if (!on_chain) { - throw KDMError (_("KDM was not made for DCP-o-matic's decryption certificate."), e.what()); - } else if (on_chain && kdm_subject_name != dc->leaf().subject()) { - throw KDMError (_("KDM was made for DCP-o-matic but not for its leaf certificate."), e.what()); - } else { - throw; - } - } -} /** Find all the CPLs in our directories, cross-add assets and return the CPLs */ list > @@ -100,7 +76,7 @@ DCP::cpls () const } if (_dcp_content->kdm ()) { - dcp::DecryptedKDM k = decrypted_kdm (); + dcp::DecryptedKDM k = decrypt_kdm_with_helpful_error (_dcp_content->kdm().get()); BOOST_FOREACH (shared_ptr i, dcps) { i->add (k); } diff --git a/src/lib/dcp.h b/src/lib/dcp.h index b98dce5d4..d449fdb39 100644 --- a/src/lib/dcp.h +++ b/src/lib/dcp.h @@ -32,7 +32,6 @@ class DCP { public: std::list > cpls () const; - dcp::DecryptedKDM decrypted_kdm () const; protected: explicit DCP (boost::shared_ptr content, bool tolerant) diff --git a/src/lib/util.cc b/src/lib/util.cc index c1ef4245f..bff205cfb 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -45,6 +45,7 @@ #include "image.h" #include "text_decoder.h" #include "job_manager.h" +#include #include #include #include @@ -1201,3 +1202,29 @@ scale_for_display (dcp::Size s, dcp::Size display_container, dcp::Size film_cont return s; } + +dcp::DecryptedKDM +decrypt_kdm_with_helpful_error (dcp::EncryptedKDM kdm) +{ + try { + return dcp::DecryptedKDM (kdm, Config::instance()->decryption_chain()->key().get()); + } catch (dcp::KDMDecryptionError& e) { + /* Try to flesh out the error a bit */ + string const kdm_subject_name = kdm.recipient_x509_subject_name(); + bool on_chain = false; + shared_ptr dc = Config::instance()->decryption_chain(); + BOOST_FOREACH (dcp::Certificate i, dc->root_to_leaf()) { + if (i.subject() == kdm_subject_name) { + on_chain = true; + } + } + if (!on_chain) { + throw KDMError (_("This KDM was not made for DCP-o-matic's decryption certificate."), e.what()); + } else if (on_chain && kdm_subject_name != dc->leaf().subject()) { + throw KDMError (_("This KDM was made for DCP-o-matic but not for its leaf certificate."), e.what()); + } else { + throw; + } + } +} + diff --git a/src/lib/util.h b/src/lib/util.h index f7b4704ac..14228ff7f 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -28,6 +28,7 @@ #include "types.h" #include "dcpomatic_time.h" #include "audio_mapping.h" +#include #include #include #include @@ -117,6 +118,7 @@ extern boost::shared_ptr read_swaroop_chain (boost::files extern void write_swaroop_chain (boost::shared_ptr chain, boost::filesystem::path output); #endif extern dcp::Size scale_for_display (dcp::Size s, dcp::Size display_container, dcp::Size film_container); +extern dcp::DecryptedKDM decrypt_kdm_with_helpful_error (dcp::EncryptedKDM kdm); template std::list diff --git a/src/wx/content_menu.cc b/src/wx/content_menu.cc index ec966b81a..d3115ce49 100644 --- a/src/wx/content_menu.cc +++ b/src/wx/content_menu.cc @@ -40,6 +40,7 @@ #include "lib/copy_dcp_details_to_film.h" #include #include +#include #include #include #include @@ -415,6 +416,17 @@ ContentMenu::kdm () return; } + /* Try to decrypt it to get an early preview of any errors */ + try { + decrypt_kdm_with_helpful_error (*kdm); + } catch (KDMError& e) { + error_dialog (_parent, std_to_wx(e.summary()), std_to_wx(e.detail())); + return; + } catch (exception& e) { + error_dialog (_parent, e.what()); + return; + } + DCPExaminer ex (dcp, true); bool kdm_matches_any_cpl = false; @@ -424,7 +436,6 @@ ContentMenu::kdm () } } - bool kdm_matches_selected_cpl = dcp->cpl() || kdm->cpl_id() == dcp->cpl().get(); if (!kdm_matches_any_cpl) { -- 2.30.2