Verify encrypted DCPs (more) correctly (#2659).
authorCarl Hetherington <cth@carlh.net>
Sun, 19 Nov 2023 23:25:27 +0000 (00:25 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 20 Nov 2023 20:37:37 +0000 (21:37 +0100)
cscript
src/lib/verify_dcp_job.cc
src/lib/verify_dcp_job.h
src/tools/dcpomatic_player.cc
test/reels_test.cc
test/test.cc

diff --git a/cscript b/cscript
index 9d5a72eafd99fc3a5af16bf769988a69856fe439..de4fcb122c76033480411f9ecb06ddcb0b3cc1f9 100644 (file)
--- a/cscript
+++ b/cscript
@@ -508,7 +508,7 @@ def dependencies(target, options):
         # Use distro-provided FFmpeg on Arch
         deps = []
 
-    deps.append(('libdcp', 'c46f6125c482f2a3361cd33d1e1163927f038e9d'))
+    deps.append(('libdcp', 'v1.8.88'))
     deps.append(('libsub', 'v1.6.44'))
     deps.append(('leqm-nrt', '30dcaea1373ac62fba050e02ce5b0c1085797a23'))
     deps.append(('rtaudio', 'f619b76'))
index e054fae3a8774e81594b1474b04966e3ffb11ef7..5e50ec51db3bd3873c99de004d7ae6be01e48758 100644 (file)
@@ -19,6 +19,7 @@
 */
 
 
+#include "config.h"
 #include "cross.h"
 #include "verify_dcp_job.h"
 #include "content.h"
@@ -35,9 +36,10 @@ using namespace boost::placeholders;
 #endif
 
 
-VerifyDCPJob::VerifyDCPJob (vector<boost::filesystem::path> directories)
+VerifyDCPJob::VerifyDCPJob(vector<boost::filesystem::path> directories, vector<boost::filesystem::path> kdms)
        : Job (shared_ptr<Film>())
        , _directories (directories)
+       , _kdms(kdms)
 {
 
 }
@@ -76,7 +78,22 @@ VerifyDCPJob::update_stage (string s, optional<boost::filesystem::path> path)
 void
 VerifyDCPJob::run ()
 {
-       _notes = dcp::verify(_directories, bind(&VerifyDCPJob::update_stage, this, _1, _2), bind(&VerifyDCPJob::set_progress, this, _1, false), {}, libdcp_resources_path() / "xsd");
+       vector<dcp::DecryptedKDM> decrypted_kdms;
+       auto key = Config::instance()->decryption_chain()->key();
+       if (key) {
+               for (auto kdm: _kdms) {
+                       decrypted_kdms.push_back(dcp::DecryptedKDM{dcp::EncryptedKDM(dcp::file_to_string(kdm)), *key});
+               }
+       }
+
+       _notes = dcp::verify(
+               _directories,
+               decrypted_kdms,
+               bind(&VerifyDCPJob::update_stage, this, _1, _2),
+               bind(&VerifyDCPJob::set_progress, this, _1, false),
+               {},
+               libdcp_resources_path() / "xsd"
+               );
 
        bool failed = false;
        for (auto i: _notes) {
index b00f0128ba0213a430b95ac7d32f3cbcfbb928de..61a34750717879a288cd22c886c9a1d3bb2cad91 100644 (file)
@@ -29,7 +29,7 @@ class Content;
 class VerifyDCPJob : public Job
 {
 public:
-       explicit VerifyDCPJob (std::vector<boost::filesystem::path> directories);
+       VerifyDCPJob(std::vector<boost::filesystem::path> directories, std::vector<boost::filesystem::path> kdms);
        ~VerifyDCPJob ();
 
        std::string name () const override;
@@ -44,5 +44,6 @@ private:
        void update_stage (std::string s, boost::optional<boost::filesystem::path> path);
 
        std::vector<boost::filesystem::path> _directories;
+       std::vector<boost::filesystem::path> _kdms;
        std::vector<dcp::VerificationNote> _notes;
 };
index d1668975c4b95cd0068565fe8176a73504423538..212169d84ec0f13e8f337470763afa9b34213ce4 100644 (file)
@@ -713,6 +713,7 @@ private:
                                        _viewer.set_coalesce_player_changes(true);
                                        for (auto path: dialog.paths()) {
                                                dcp->add_kdm(dcp::EncryptedKDM(dcp::file_to_string(path)));
+                                               _kdms.push_back(path);
                                        }
                                        examine_content();
                                }
@@ -913,7 +914,7 @@ private:
                auto dcp = std::dynamic_pointer_cast<DCPContent>(_film->content().front());
                DCPOMATIC_ASSERT (dcp);
 
-               auto job = make_shared<VerifyDCPJob>(dcp->directories());
+               auto job = make_shared<VerifyDCPJob>(dcp->directories(), _kdms);
                VerifyDCPProgressDialog progress(this, _("DCP-o-matic Player"));
                bool const completed = progress.run(job);
                progress.Close();
@@ -1125,6 +1126,8 @@ private:
        wxMenuItem* _view_dual_screen = nullptr;
        wxSizer* _main_sizer = nullptr;
        PlayerStressTester _stress;
+       /** KDMs that have been loaded, so that we can pass them to the verifier */
+       std::vector<boost::filesystem::path> _kdms;
 };
 
 static const wxCmdLineEntryDesc command_line_description[] = {
index 3d4dd0e6e2ea16dce5b8781394123c5270acf418..2a87ef6b64bec37cb62be23228f47646104f4536 100644 (file)
@@ -503,7 +503,7 @@ BOOST_AUTO_TEST_CASE (reels_should_not_be_short1)
        make_and_verify_dcp (film);
 
        vector<boost::filesystem::path> dirs = { film->dir(film->dcp_name(false)) };
-       auto notes = dcp::verify(dirs, boost::bind(&no_op), boost::bind(&no_op), {}, TestPaths::xsd());
+       auto notes = dcp::verify(dirs, {}, boost::bind(&no_op), boost::bind(&no_op), {}, TestPaths::xsd());
        dump_notes (notes);
        BOOST_REQUIRE (notes.empty());
 }
@@ -528,7 +528,7 @@ BOOST_AUTO_TEST_CASE (reels_should_not_be_short2)
        make_and_verify_dcp (film);
 
        vector<boost::filesystem::path> dirs = { film->dir(film->dcp_name(false)) };
-       auto const notes = dcp::verify(dirs, boost::bind(&no_op), boost::bind(&no_op), {}, TestPaths::xsd());
+       auto const notes = dcp::verify(dirs, {}, boost::bind(&no_op), boost::bind(&no_op), {}, TestPaths::xsd());
        dump_notes (notes);
        BOOST_REQUIRE (notes.empty());
 }
@@ -549,7 +549,7 @@ BOOST_AUTO_TEST_CASE (reels_should_not_be_short3)
 
        make_and_verify_dcp (film);
 
-       auto const notes = dcp::verify({}, boost::bind(&no_op), boost::bind(&no_op), {}, TestPaths::xsd());
+       auto const notes = dcp::verify({}, {}, boost::bind(&no_op), boost::bind(&no_op), {}, TestPaths::xsd());
        dump_notes (notes);
        BOOST_REQUIRE (notes.empty());
 }
@@ -579,7 +579,7 @@ BOOST_AUTO_TEST_CASE (reels_should_not_be_short4)
        BOOST_REQUIRE (!wait_for_jobs());
 
        vector<boost::filesystem::path> dirs = { film->dir(film->dcp_name(false)) };
-       auto const notes = dcp::verify(dirs, boost::bind(&no_op), boost::bind(&no_op), {}, TestPaths::xsd());
+       auto const notes = dcp::verify(dirs, {}, boost::bind(&no_op), boost::bind(&no_op), {}, TestPaths::xsd());
        dump_notes (notes);
        BOOST_REQUIRE (notes.empty());
 }
index 2bd31292a562ffab3dd49522810935257c089e18..8ca103a6bdedb9800c97ef94f3f14509ac5253ee 100644 (file)
@@ -948,7 +948,7 @@ void progress (float) {}
 void
 verify_dcp(boost::filesystem::path dir, vector<dcp::VerificationNote::Code> ignore)
 {
-       auto notes = dcp::verify({dir}, &stage, &progress, {}, TestPaths::xsd());
+       auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, TestPaths::xsd());
        bool ok = true;
        for (auto i: notes) {
                if (find(ignore.begin(), ignore.end(), i.code()) == ignore.end()) {