Fix crashes when using kdm_cli with a certificate instead of a cinema.
authorCarl Hetherington <cth@carlh.net>
Sun, 9 Jan 2022 21:24:06 +0000 (22:24 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 10 Jan 2022 18:27:18 +0000 (19:27 +0100)
src/lib/kdm_cli.cc
test/kdm_cli_test.cc [new file with mode: 0644]
test/wscript

index e9a3651ba3d24ca5f7cabe3ce04b4a953ea96ced..e6ba600f40121eeecc1857bb1aaee48fc19a64bc 100644 (file)
@@ -354,8 +354,11 @@ from_dkdm (
                                continue;
                        }
 
-                       dcp::LocalTime begin(valid_from, i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute());
-                       dcp::LocalTime end(valid_to, i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute());
+                       int const offset_hour = i->cinema ? i->cinema->utc_offset_hour() : 0;
+                       int const offset_minute = i->cinema ? i->cinema->utc_offset_minute() : 0;
+
+                       dcp::LocalTime begin(valid_from, offset_hour, offset_minute);
+                       dcp::LocalTime end(valid_to, offset_hour, offset_minute);
 
                        auto const kdm = kdm_from_dkdm(
                                                        dkdm,
@@ -369,14 +372,14 @@ from_dkdm (
                                                        );
 
                        dcp::NameFormat::Map name_values;
-                       name_values['c'] = i->cinema->name;
+                       name_values['c'] = i->cinema ? i->cinema->name : "";
                        name_values['s'] = i->name;
                        name_values['f'] = dkdm.annotation_text().get_value_or("");
                        name_values['b'] = begin.date() + " " + begin.time_of_day(true, false);
                        name_values['e'] = end.date() + " " + end.time_of_day(true, false);
                        name_values['i'] = kdm.cpl_id();
 
-                       kdms.push_back (make_shared<KDMWithMetadata>(name_values, i->cinema.get(), i->cinema->emails, kdm));
+                       kdms.push_back (make_shared<KDMWithMetadata>(name_values, i->cinema.get(), i->cinema ? i->cinema->emails : list<string>(), kdm));
                }
                write_files (kdms, zip, output, container_name_format, filename_format, verbose, out);
                if (email) {
diff --git a/test/kdm_cli_test.cc b/test/kdm_cli_test.cc
new file mode 100644 (file)
index 0000000..404f7f8
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+    Copyright (C) 2022 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "lib/kdm_cli.h"
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+
+
+using std::string;
+using std::vector;
+
+
+BOOST_AUTO_TEST_CASE (kdm_cli_test_certificate)
+{
+       vector<string> args = {
+               "kdm_cli",
+               "--verbose",
+               "--valid-from", "now",
+               "--valid-duration", "2 weeks",
+               "--certificate", "test/data/cert.pem",
+               "test/data/dkdm.xml"
+       };
+
+       char** argv = new char*[args.size()];
+       for (auto i = 0U; i < args.size(); ++i) {
+               argv[i] = const_cast<char*>(args[i].c_str());
+       }
+
+       auto error = kdm_cli (args.size(), argv, [](string s) { std::cout << s << "\n"; });
+       if (error) {
+               std::cout << *error << "\n";
+       }
+       BOOST_CHECK (!error);
+
+       delete[] argv;
+}
+
index d3fa632b9901f6d4e8a4f4827477fd91cb9c4b33..1e24956bfab1ad6a3117d7eedb96c4649de9ff6e 100644 (file)
@@ -99,6 +99,7 @@ def build(bld):
                  isdcf_name_test.cc
                  j2k_bandwidth_test.cc
                  job_manager_test.cc
+                 kdm_cli_test.cc
                  kdm_naming_test.cc
                  low_bitrate_test.cc
                  markers_test.cc