X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_kdm.cc;h=ef6b783f4fa0045bb753b2fdfc8f4aefe1509d80;hb=4d11fe7cea71b0564df9a21a3cc706509d12b0d1;hp=1e6e9052e4a631bf7968e85a47df1dbdfc7831f8;hpb=eb2ea2746ac25ede54a04b46b26e1ebc088357b7;p=dcpomatic.git diff --git a/src/tools/dcpomatic_kdm.cc b/src/tools/dcpomatic_kdm.cc index 1e6e9052e..ef6b783f4 100644 --- a/src/tools/dcpomatic_kdm.cc +++ b/src/tools/dcpomatic_kdm.cc @@ -46,6 +46,9 @@ #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 +77,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 +302,94 @@ 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 > screen_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()) + ); + + /* Encrypt */ + screen_kdms.push_back ( + shared_ptr( + new ECinemaScreenKDM(i, 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); + } + + /* Encrypt */ + screen_kdms.push_back ( + shared_ptr( + new DCPScreenKDM( + i, + kdm.encrypt( + signer, i->recipient.get(), i->trusted_device_thumbprints(), _output->formulation(), + !_output->forensic_mark_video(), _output->forensic_mark_audio() ? boost::optional() : 0 + ) + ) ) - ) - ); + ); + } + } + + if (screen_kdms.empty()) { + return; } pair, int> result = _output->make ( - screen_kdms, decrypted.content_title_text(), _timing, bind (&DOMFrame::confirm_overwrite, this, _1) + screen_kdms, title, _timing, bind (&DOMFrame::confirm_overwrite, this, _1) ); if (result.first) { @@ -382,7 +425,11 @@ private: _output->setup_sensitivity (); wxArrayTreeItemIds sel; _dkdm->GetSelections (sel); + shared_ptr group = dynamic_pointer_cast(selected_dkdm()); + shared_ptr dkdm = dynamic_pointer_cast(selected_dkdm()); _create->Enable (!_screens->screens().empty() && sel.GetCount() > 0); + _remove_dkdm->Enable (sel.GetCount() > 0 && (!group || group->name() != "root")); + _export_dkdm->Enable (sel.GetCount() > 0 && dkdm); } void dkdm_begin_drag (wxTreeEvent& ev) @@ -418,16 +465,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 ();