X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_kdm.cc;h=dd45401cb70c050c79c602c1d7a1e0a182daa680;hb=0ab8cf5b312f36a14f66d4564c6f4b1694ddaae0;hp=8ee4c72d40f27c2c1670b178bc63b27eac42227b;hpb=2e134de1d71debb8465a43703b14a19ffeb4211e;p=dcpomatic.git diff --git a/src/tools/dcpomatic_kdm.cc b/src/tools/dcpomatic_kdm.cc index 8ee4c72d4..dd45401cb 100644 --- a/src/tools/dcpomatic_kdm.cc +++ b/src/tools/dcpomatic_kdm.cc @@ -38,14 +38,16 @@ #include "lib/util.h" #include "lib/screen.h" #include "lib/job_manager.h" -#include "lib/screen_kdm.h" +#include "lib/kdm_with_metadata.h" #include "lib/exceptions.h" -#include "lib/cinema_kdms.h" #include "lib/send_kdm_email_job.h" #include "lib/compose.hpp" #include "lib/cinema.h" #include "lib/dkdm_wrapper.h" #include "lib/cross.h" +#ifdef DCPOMATIC_VARIANT_SWAROOP +#include "lib/decrypted_ecinema_kdm.h" +#endif #include #include #include @@ -74,6 +76,7 @@ using boost::bind; using boost::optional; using boost::ref; using boost::dynamic_pointer_cast; +using namespace dcpomatic; enum { ID_help_report_a_problem = 1, @@ -298,55 +301,103 @@ private: if (!dkdm_base) { return; } - shared_ptr dkdm = boost::dynamic_pointer_cast (dkdm_base); - if (!dkdm) { - return; - } - - /* Decrypt the DKDM */ - dcp::DecryptedKDM decrypted (dkdm->dkdm(), Config::instance()->decryption_chain()->key().get()); - /* This is the signer for our new KDMs */ - shared_ptr signer = Config::instance()->signer_chain (); - if (!signer->valid ()) { - throw InvalidSignerError (); + list kdms; + string title; + +#ifdef DCPOMATIC_VARIANT_SWAROOP + shared_ptr ecinema_dkdm = boost::dynamic_pointer_cast (dkdm_base); + if (ecinema_dkdm) { + DecryptedECinemaKDM decrypted (ecinema_dkdm->dkdm(), Config::instance()->decryption_chain()->key().get()); + title = decrypted.name (); + + BOOST_FOREACH (shared_ptr i, _screens->screens()) { + + if (!i->recipient) { + continue; + } + + DecryptedECinemaKDM kdm ( + decrypted.id(), + decrypted.name(), + decrypted.key(), + dcp::LocalTime (_timing->from(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()), + dcp::LocalTime (_timing->until(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()) + ); + + dcp::NameFormat::Map name_values; + name_values['c'] = i->cinema->name; + name_values['s'] = i->name; + + /* Encrypt */ + kdms.push_back ( + KDMWithMetadataPtr( + new ECinemaKDMWithMetadata(name_values, i->cinema, kdm.encrypt(i->recipient.get())) + ) + ); + } } +#endif - list screen_kdms; - BOOST_FOREACH (shared_ptr i, _screens->screens()) { - - if (!i->recipient) { - continue; - } + shared_ptr dkdm = boost::dynamic_pointer_cast (dkdm_base); + if (dkdm) { - /* Make an empty KDM */ - dcp::DecryptedKDM kdm ( - dcp::LocalTime (_timing->from(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()), - dcp::LocalTime (_timing->until(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()), - decrypted.annotation_text().get_value_or (""), - decrypted.content_title_text(), - dcp::LocalTime().as_string() - ); + /* Decrypt the DKDM */ + dcp::DecryptedKDM decrypted (dkdm->dkdm(), Config::instance()->decryption_chain()->key().get()); + title = decrypted.content_title_text (); - /* Add keys from the DKDM */ - BOOST_FOREACH (dcp::DecryptedKDMKey const & j, decrypted.keys()) { - kdm.add_key (j); + /* This is the signer for our new KDMs */ + shared_ptr signer = Config::instance()->signer_chain (); + if (!signer->valid ()) { + throw InvalidSignerError (); } - /* Encrypt */ - screen_kdms.push_back ( - ScreenKDM ( - i, - kdm.encrypt ( - signer, i->recipient.get(), i->trusted_device_thumbprints(), _output->formulation(), - !_output->forensic_mark_video(), _output->forensic_mark_audio() ? boost::optional() : 0 + BOOST_FOREACH (shared_ptr i, _screens->screens()) { + + if (!i->recipient) { + continue; + } + + /* Make an empty KDM */ + dcp::DecryptedKDM kdm ( + dcp::LocalTime (_timing->from(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()), + dcp::LocalTime (_timing->until(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()), + decrypted.annotation_text().get_value_or (""), + decrypted.content_title_text(), + dcp::LocalTime().as_string() + ); + + /* Add keys from the DKDM */ + BOOST_FOREACH (dcp::DecryptedKDMKey const & j, decrypted.keys()) { + kdm.add_key (j); + } + + dcp::NameFormat::Map name_values; + name_values['c'] = i->cinema->name; + name_values['s'] = i->name; + + /* Encrypt */ + kdms.push_back ( + KDMWithMetadataPtr( + new DCPKDMWithMetadata( + name_values, + i->cinema, + kdm.encrypt( + signer, i->recipient.get(), i->trusted_device_thumbprints(), _output->formulation(), + !_output->forensic_mark_video(), _output->forensic_mark_audio() ? boost::optional() : 0 + ) + ) ) - ) - ); + ); + } + } + + if (kdms.empty()) { + return; } pair, int> result = _output->make ( - screen_kdms, decrypted.content_title_text(), _timing, bind (&DOMFrame::confirm_overwrite, this, _1) + kdms, title, _timing, bind (&DOMFrame::confirm_overwrite, this, _1) ); if (result.first) { @@ -422,16 +473,53 @@ private: { wxFileDialog* d = new wxFileDialog (this, _("Select DKDM file")); if (d->ShowModal() == wxID_OK) { - shared_ptr new_dkdm; + shared_ptr chain = Config::instance()->decryption_chain(); + DCPOMATIC_ASSERT (chain->key()); + +#ifdef DCPOMATIC_VARIANT_SWAROOP try { - dcp::EncryptedKDM ekdm(dcp::file_to_string (wx_to_std (d->GetPath ()), MAX_KDM_SIZE)); + cxml::Document test_doc; + string const xml_string = dcp::file_to_string (wx_to_std(d->GetPath()), MAX_KDM_SIZE); + test_doc.read_string (xml_string); + if (test_doc.root_name() == "ECinemaSecurityMessage") { + EncryptedECinemaKDM ekdm(xml_string); + /* Decrypt the DKDM to make sure that we can */ + DecryptedECinemaKDM dkdm(ekdm, chain->key().get()); + + shared_ptr new_dkdm(new ECinemaDKDM(ekdm)); + shared_ptr group = dynamic_pointer_cast (selected_dkdm()); + if (!group) { + group = Config::instance()->dkdms(); + } + add_dkdm_model (new_dkdm, group); + add_dkdm_view (new_dkdm); + d->Destroy (); + return; + } + } catch (KDMError& e) { + error_dialog ( + this, "Could not read file as a KDM. Perhaps it is badly formatted, created with the wrong certificate, or not a KDM at all.", + std_to_wx(e.what()) + ); + d->Destroy (); + return; + } catch (dcp::MiscError& e) { + error_dialog ( + this, + _("Could not read file as a KDM. It is much too large. Make sure you are loading a DKDM (XML) file."), + std_to_wx(e.what()) + ); + d->Destroy (); + return; + } +#endif + try { + dcp::EncryptedKDM ekdm(dcp::file_to_string (wx_to_std (d->GetPath ()), MAX_KDM_SIZE)); /* Decrypt the DKDM to make sure that we can */ - shared_ptr chain = Config::instance()->decryption_chain(); - DCPOMATIC_ASSERT (chain->key()); dcp::DecryptedKDM dkdm(ekdm, chain->key().get()); - new_dkdm.reset(new DKDM(ekdm)); + shared_ptr new_dkdm(new DKDM(ekdm)); shared_ptr group = dynamic_pointer_cast (selected_dkdm ()); if (!group) { group = Config::instance()->dkdms ();