Give 'wrong target' KDM errors in a dialogue box rather than in the job manager ...
authorCarl Hetherington <cth@carlh.net>
Wed, 20 May 2020 22:05:50 +0000 (00:05 +0200)
committerCarl Hetherington <cth@carlh.net>
Wed, 20 May 2020 22:05:50 +0000 (00:05 +0200)
src/lib/dcp.cc
src/lib/dcp.h
src/lib/util.cc
src/lib/util.h
src/wx/content_menu.cc

index 477b61e..2f56a4e 100644 (file)
@@ -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<const dcp::CertificateChain> 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<shared_ptr<dcp::CPL> >
@@ -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<dcp::DCP> i, dcps) {
                        i->add (k);
                }
index b98dce5..d449fdb 100644 (file)
@@ -32,7 +32,6 @@ class DCP
 {
 public:
        std::list<boost::shared_ptr<dcp::CPL> > cpls () const;
-       dcp::DecryptedKDM decrypted_kdm () const;
 
 protected:
        explicit DCP (boost::shared_ptr<const DCPContent> content, bool tolerant)
index c1ef424..bff205c 100644 (file)
@@ -45,6 +45,7 @@
 #include "image.h"
 #include "text_decoder.h"
 #include "job_manager.h"
+#include <dcp/decrypted_kdm.h>
 #include <dcp/locale_convert.h>
 #include <dcp/util.h>
 #include <dcp/raw_convert.h>
@@ -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<const dcp::CertificateChain> 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;
+               }
+       }
+}
+
index f7b4704..14228ff 100644 (file)
@@ -28,6 +28,7 @@
 #include "types.h"
 #include "dcpomatic_time.h"
 #include "audio_mapping.h"
+#include <dcp/decrypted_kdm.h>
 #include <dcp/util.h>
 #include <dcp/subtitle_image.h>
 #include <boost/shared_ptr.hpp>
@@ -117,6 +118,7 @@ extern boost::shared_ptr<dcp::CertificateChain> read_swaroop_chain (boost::files
 extern void write_swaroop_chain (boost::shared_ptr<const dcp::CertificateChain> 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 <class T>
 std::list<T>
index ec966b8..d3115ce 100644 (file)
@@ -40,6 +40,7 @@
 #include "lib/copy_dcp_details_to_film.h"
 #include <dcp/cpl.h>
 #include <dcp/exceptions.h>
+#include <dcp/decrypted_kdm.h>
 #include <wx/wx.h>
 #include <wx/dirdlg.h>
 #include <boost/foreach.hpp>
@@ -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) {