diff options
author | Jay Berkenbilt <ejb@ql.org> | 2022-05-30 16:55:07 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2022-05-31 02:03:08 +0200 |
commit | b7bbf12e85fa46e7971d84143d1597c992045af1 (patch) | |
tree | 615ac14943d0701c5fed9d2e27f80f70044c695a /libqpdf/QPDFJob.cc | |
parent | f049a77c5962a0e41723bc83900656ece821d916 (diff) | |
download | qpdf-b7bbf12e85fa46e7971d84143d1597c992045af1.tar.zst |
In json mode, reveal recovered user password when otherwise unavailable
Diffstat (limited to 'libqpdf/QPDFJob.cc')
-rw-r--r-- | libqpdf/QPDFJob.cc | 10 |
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", |