summaryrefslogtreecommitdiff
path: root/src/lib/util.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-05-21 00:05:50 +0200
committerCarl Hetherington <cth@carlh.net>2020-05-21 00:05:50 +0200
commit83416808c0b1ca732e7a186d3811f1ec796fea08 (patch)
treef18fde5c358212f5cb0c2ee12700d5b0081590d8 /src/lib/util.cc
parentdda7d841eac2305379aa86d11249dbb4b98d5bb7 (diff)
Give 'wrong target' KDM errors in a dialogue box rather than in the job manager (part of #1161).
Diffstat (limited to 'src/lib/util.cc')
-rw-r--r--src/lib/util.cc27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/lib/util.cc b/src/lib/util.cc
index c1ef4245f..bff205cfb 100644
--- a/src/lib/util.cc
+++ b/src/lib/util.cc
@@ -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;
+ }
+ }
+}
+