aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFJob.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2022-05-30 16:55:07 +0200
committerJay Berkenbilt <ejb@ql.org>2022-05-31 02:03:08 +0200
commitb7bbf12e85fa46e7971d84143d1597c992045af1 (patch)
tree615ac14943d0701c5fed9d2e27f80f70044c695a /libqpdf/QPDFJob.cc
parentf049a77c5962a0e41723bc83900656ece821d916 (diff)
downloadqpdf-b7bbf12e85fa46e7971d84143d1597c992045af1.tar.zst
In json mode, reveal recovered user password when otherwise unavailable
Diffstat (limited to 'libqpdf/QPDFJob.cc')
-rw-r--r--libqpdf/QPDFJob.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc
index d7cc66cf..b6ba4b4f 100644
--- a/libqpdf/QPDFJob.cc
+++ b/libqpdf/QPDFJob.cc
@@ -1382,6 +1382,15 @@ QPDFJob::doJSONEncrypt(Pipeline* p, bool& first, QPDF& pdf)
j_encrypt.addDictionaryMember(
"ownerpasswordmatched",
JSON::makeBool(is_encrypted && pdf.ownerPasswordMatched()));
+ if (is_encrypted && (V < 5) && pdf.ownerPasswordMatched() &&
+ (!pdf.userPasswordMatched())) {
+ std::string user_password = pdf.getTrimmedUserPassword();
+ j_encrypt.addDictionaryMember(
+ "recovereduserpassword", JSON::makeString(user_password));
+ } else {
+ j_encrypt.addDictionaryMember(
+ "recovereduserpassword", JSON::makeNull());
+ }
JSON j_capabilities =
j_encrypt.addDictionaryMember("capabilities", JSON::makeDictionary());
j_capabilities.addDictionaryMember(
@@ -1669,6 +1678,7 @@ QPDFJob::json_schema(int json_version, std::set<std::string>* keys)
},
"encrypted": "whether the document is encrypted",
"ownerpasswordmatched": "whether supplied password matched owner password; always false for non-encrypted files",
+ "recovereduserpassword": "If the owner password was used to recover the user password, reveal user password; otherwise null",
"parameters": {
"P": "P value from Encrypt dictionary",
"R": "R value from Encrypt dictionary",