Commit 4ca185fd96dfd3c7a8d89d3afd8093a26acf178b
1 parent
2f37633b
Remove --disable-signatures; incorporate into --remove-restrictions
Rather than adding yet another flag that is almost never useful on its own, just have --remove-restrictions disable digital signatures. The operations are still separate in the API.
Showing
19 changed files
with
1678 additions
and
962 deletions
ChangeLog
| @@ -4,10 +4,10 @@ | @@ -4,10 +4,10 @@ | ||
| 4 | official installers will offer to modify PATH when installing | 4 | official installers will offer to modify PATH when installing |
| 5 | qpdf. Fixes #1054. | 5 | qpdf. Fixes #1054. |
| 6 | 6 | ||
| 7 | - * Add QPDFAcroFormDocumentHelper::disableDigitalSignatures and the | ||
| 8 | - --disable-signatures command-line argument. This disables any | ||
| 9 | - digital signature fields, leaving their visual representations | ||
| 10 | - intact. | 7 | + * Add QPDFAcroFormDocumentHelper::disableDigitalSignatures, which |
| 8 | + disables any digital signature fields, leaving their visual | ||
| 9 | + representations intact. The --remove-restrictions command-line | ||
| 10 | + argument now calls this. Fixes #1015. | ||
| 11 | 11 | ||
| 12 | 2023-12-22 Jay Berkenbilt <ejb@ql.org> | 12 | 2023-12-22 Jay Berkenbilt <ejb@ql.org> |
| 13 | 13 |
include/qpdf/QPDF.hh
| @@ -600,7 +600,9 @@ class QPDF | @@ -600,7 +600,9 @@ class QPDF | ||
| 600 | // Return the previously computed or retrieved encryption key for this file | 600 | // Return the previously computed or retrieved encryption key for this file |
| 601 | QPDF_DLL | 601 | QPDF_DLL |
| 602 | std::string getEncryptionKey() const; | 602 | std::string getEncryptionKey() const; |
| 603 | - // Remove security restrictions associated with digitally signed files. | 603 | + // Remove security restrictions associated with digitally signed files. From qpdf 11.7.0, this |
| 604 | + // is called by QPDFAcroFormDocumentHelper::disableDigitalSignatures and is more useful when | ||
| 605 | + // called from there than when just called by itself. | ||
| 604 | QPDF_DLL | 606 | QPDF_DLL |
| 605 | void removeSecurityRestrictions(); | 607 | void removeSecurityRestrictions(); |
| 606 | 608 |
include/qpdf/QPDFAcroFormDocumentHelper.hh
| @@ -164,7 +164,8 @@ class QPDFAcroFormDocumentHelper: public QPDFDocumentHelper | @@ -164,7 +164,8 @@ class QPDFAcroFormDocumentHelper: public QPDFDocumentHelper | ||
| 164 | void generateAppearancesIfNeeded(); | 164 | void generateAppearancesIfNeeded(); |
| 165 | 165 | ||
| 166 | // Disable Digital Signature Fields. Remove all digital signature fields from the document, | 166 | // Disable Digital Signature Fields. Remove all digital signature fields from the document, |
| 167 | - // leaving any annotation showing the content of the field intact. | 167 | + // leaving any annotation showing the content of the field intact. This also calls |
| 168 | + // QPDF::removeSecurityRestrictions. | ||
| 168 | QPDF_DLL | 169 | QPDF_DLL |
| 169 | void disableDigitalSignatures(); | 170 | void disableDigitalSignatures(); |
| 170 | 171 |
include/qpdf/QPDFJob.hh
| @@ -557,7 +557,6 @@ class QPDFJob | @@ -557,7 +557,6 @@ class QPDFJob | ||
| 557 | bool linearize{false}; | 557 | bool linearize{false}; |
| 558 | bool decrypt{false}; | 558 | bool decrypt{false}; |
| 559 | bool remove_restrictions{false}; | 559 | bool remove_restrictions{false}; |
| 560 | - bool disable_signatures{false}; | ||
| 561 | int split_pages{0}; | 560 | int split_pages{0}; |
| 562 | bool progress{false}; | 561 | bool progress{false}; |
| 563 | std::function<void(int)> progress_handler{nullptr}; | 562 | std::function<void(int)> progress_handler{nullptr}; |
include/qpdf/auto_job_c_main.hh
| @@ -11,7 +11,6 @@ QPDF_DLL Config* checkLinearization(); | @@ -11,7 +11,6 @@ QPDF_DLL Config* checkLinearization(); | ||
| 11 | QPDF_DLL Config* coalesceContents(); | 11 | QPDF_DLL Config* coalesceContents(); |
| 12 | QPDF_DLL Config* decrypt(); | 12 | QPDF_DLL Config* decrypt(); |
| 13 | QPDF_DLL Config* deterministicId(); | 13 | QPDF_DLL Config* deterministicId(); |
| 14 | -QPDF_DLL Config* disableSignatures(); | ||
| 15 | QPDF_DLL Config* externalizeInlineImages(); | 14 | QPDF_DLL Config* externalizeInlineImages(); |
| 16 | QPDF_DLL Config* filteredStreamData(); | 15 | QPDF_DLL Config* filteredStreamData(); |
| 17 | QPDF_DLL Config* flattenRotation(); | 16 | QPDF_DLL Config* flattenRotation(); |
job.sums
| @@ -4,17 +4,17 @@ generate_auto_job f64733b79dcee5a0e3e8ccc6976448e8ddf0e8b6529987a66a7d3ab2ebc10a | @@ -4,17 +4,17 @@ generate_auto_job f64733b79dcee5a0e3e8ccc6976448e8ddf0e8b6529987a66a7d3ab2ebc10a | ||
| 4 | include/qpdf/auto_job_c_att.hh 4c2b171ea00531db54720bf49a43f8b34481586ae7fb6cbf225099ee42bc5bb4 | 4 | include/qpdf/auto_job_c_att.hh 4c2b171ea00531db54720bf49a43f8b34481586ae7fb6cbf225099ee42bc5bb4 |
| 5 | include/qpdf/auto_job_c_copy_att.hh 50609012bff14fd82f0649185940d617d05d530cdc522185c7f3920a561ccb42 | 5 | include/qpdf/auto_job_c_copy_att.hh 50609012bff14fd82f0649185940d617d05d530cdc522185c7f3920a561ccb42 |
| 6 | include/qpdf/auto_job_c_enc.hh 28446f3c32153a52afa239ea40503e6cc8ac2c026813526a349e0cd4ae17ddd5 | 6 | include/qpdf/auto_job_c_enc.hh 28446f3c32153a52afa239ea40503e6cc8ac2c026813526a349e0cd4ae17ddd5 |
| 7 | -include/qpdf/auto_job_c_main.hh 36b5ff48ae0dca67415efececa4470cda45364b10d0905e7de9971a2af1795ea | 7 | +include/qpdf/auto_job_c_main.hh dbfc221d1533120d1aa9c361d8d2483dea5fcb1c0fd95144d98d305e64ed32a6 |
| 8 | include/qpdf/auto_job_c_pages.hh b3cc0f21029f6d89efa043dcdbfa183cb59325b6506001c18911614fe8e568ec | 8 | include/qpdf/auto_job_c_pages.hh b3cc0f21029f6d89efa043dcdbfa183cb59325b6506001c18911614fe8e568ec |
| 9 | include/qpdf/auto_job_c_uo.hh ae21b69a1efa9333050f4833d465f6daff87e5b38e5106e49bbef5d4132e4ed1 | 9 | include/qpdf/auto_job_c_uo.hh ae21b69a1efa9333050f4833d465f6daff87e5b38e5106e49bbef5d4132e4ed1 |
| 10 | -job.yml 3c030ce21138967b8a6768b386c0d3bfab9ef41cafbb6ec52f30a81194a7421d | 10 | +job.yml 4f89fc7b622df897d30d403d8035aa36fc7de8d8c43042c736e0300d904cb05c |
| 11 | libqpdf/qpdf/auto_job_decl.hh 9c6f701c29f3f764d620186bed92685a2edf2e4d11e4f4532862c05470cfc4d2 | 11 | libqpdf/qpdf/auto_job_decl.hh 9c6f701c29f3f764d620186bed92685a2edf2e4d11e4f4532862c05470cfc4d2 |
| 12 | -libqpdf/qpdf/auto_job_help.hh 72ae2354911aa353a0b11ca352e6ac6750c38e8c32d0d5ac6b3382ade1719c80 | ||
| 13 | -libqpdf/qpdf/auto_job_init.hh 4413804cc784f288245039af053bfe74bc2755e994308220d1939e452011e5a5 | 12 | +libqpdf/qpdf/auto_job_help.hh 62c40dcd827fcea261a9f432f457aac1331731199ee3530e40de763811ba158e |
| 13 | +libqpdf/qpdf/auto_job_init.hh b4c2b3724fba61f1206fd3bae81951636852592f67a63ef9539839c2c5995065 | ||
| 14 | libqpdf/qpdf/auto_job_json_decl.hh 06caa46eaf71db8a50c046f91866baa8087745a9474319fb7c86d92634cc8297 | 14 | libqpdf/qpdf/auto_job_json_decl.hh 06caa46eaf71db8a50c046f91866baa8087745a9474319fb7c86d92634cc8297 |
| 15 | -libqpdf/qpdf/auto_job_json_init.hh 7682e1e3bc465a3818036e1831aaf205478cc2e47ba5abe483d37c037b6bcf56 | ||
| 16 | -libqpdf/qpdf/auto_job_schema.hh 039ee828cf91ece434f0c57706aecc40798e5537308737e01efc8f61eb20685f | 15 | +libqpdf/qpdf/auto_job_json_init.hh f5acb9aa103131cb68dec0e12c4d237a6459bdb49b24773c24f0c2724a462b8f |
| 16 | +libqpdf/qpdf/auto_job_schema.hh b53c006fec2e75b1b73588d242d49a32f7d3db820b1541de106c5d4c27fbb4d9 | ||
| 17 | manual/_ext/qpdf.py 6add6321666031d55ed4aedf7c00e5662bba856dfcd66ccb526563bffefbb580 | 17 | manual/_ext/qpdf.py 6add6321666031d55ed4aedf7c00e5662bba856dfcd66ccb526563bffefbb580 |
| 18 | -manual/cli.rst e628a6e2853871679e156e63a53c493d18a38ef87cec8d44e3862401d3c8bde4 | ||
| 19 | -manual/qpdf.1 d4a1b304e86c4e02fab5b22fe324235dffbfb50746cff4aec9b2787f12a4b2f6 | 18 | +manual/cli.rst f361df89dd212daf65e82df8b7b1f8a5e3554043c545f8e7cb14ba5ded21e04e |
| 19 | +manual/qpdf.1 d44042b41642609628690560aad79845f0e9eb742624543c6fbb93f9ae065860 | ||
| 20 | manual/qpdf.1.in 436ecc85d45c4c9e2dbd1725fb7f0177fb627179469f114561adf3cb6cbb677b | 20 | manual/qpdf.1.in 436ecc85d45c4c9e2dbd1725fb7f0177fb627179469f114561adf3cb6cbb677b |
job.yml
| @@ -104,7 +104,6 @@ options: | @@ -104,7 +104,6 @@ options: | ||
| 104 | - copy-attachments-from | 104 | - copy-attachments-from |
| 105 | - decrypt | 105 | - decrypt |
| 106 | - deterministic-id | 106 | - deterministic-id |
| 107 | - - disable-signatures | ||
| 108 | - empty | 107 | - empty |
| 109 | - encrypt | 108 | - encrypt |
| 110 | - externalize-inline-images | 109 | - externalize-inline-images |
| @@ -320,7 +319,6 @@ json: | @@ -320,7 +319,6 @@ json: | ||
| 320 | decode-level: | 319 | decode-level: |
| 321 | decrypt: | 320 | decrypt: |
| 322 | deterministic-id: | 321 | deterministic-id: |
| 323 | - disable-signatures: | ||
| 324 | static-aes-iv: | 322 | static-aes-iv: |
| 325 | static-id: | 323 | static-id: |
| 326 | no-original-object-ids: | 324 | no-original-object-ids: |
libqpdf/QPDFAcroFormDocumentHelper.cc
| @@ -418,6 +418,7 @@ QPDFAcroFormDocumentHelper::generateAppearancesIfNeeded() | @@ -418,6 +418,7 @@ QPDFAcroFormDocumentHelper::generateAppearancesIfNeeded() | ||
| 418 | void | 418 | void |
| 419 | QPDFAcroFormDocumentHelper::disableDigitalSignatures() | 419 | QPDFAcroFormDocumentHelper::disableDigitalSignatures() |
| 420 | { | 420 | { |
| 421 | + qpdf.removeSecurityRestrictions(); | ||
| 421 | std::set<QPDFObjGen> to_remove; | 422 | std::set<QPDFObjGen> to_remove; |
| 422 | auto fields = getFormFields(); | 423 | auto fields = getFormFields(); |
| 423 | for (auto& f: fields) { | 424 | for (auto& f: fields) { |
libqpdf/QPDFJob.cc
| @@ -2127,9 +2127,6 @@ QPDFJob::handleTransformations(QPDF& pdf) | @@ -2127,9 +2127,6 @@ QPDFJob::handleTransformations(QPDF& pdf) | ||
| 2127 | } | 2127 | } |
| 2128 | }; | 2128 | }; |
| 2129 | if (m->remove_restrictions) { | 2129 | if (m->remove_restrictions) { |
| 2130 | - pdf.removeSecurityRestrictions(); | ||
| 2131 | - } | ||
| 2132 | - if (m->disable_signatures) { | ||
| 2133 | make_afdh(); | 2130 | make_afdh(); |
| 2134 | afdh->disableDigitalSignatures(); | 2131 | afdh->disableDigitalSignatures(); |
| 2135 | } | 2132 | } |
libqpdf/QPDFJob_config.cc
| @@ -145,13 +145,6 @@ QPDFJob::Config::deterministicId() | @@ -145,13 +145,6 @@ QPDFJob::Config::deterministicId() | ||
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | QPDFJob::Config* | 147 | QPDFJob::Config* |
| 148 | -QPDFJob::Config::disableSignatures() | ||
| 149 | -{ | ||
| 150 | - o.m->disable_signatures = true; | ||
| 151 | - return this; | ||
| 152 | -} | ||
| 153 | - | ||
| 154 | -QPDFJob::Config* | ||
| 155 | QPDFJob::Config::encryptionFilePassword(std::string const& parameter) | 148 | QPDFJob::Config::encryptionFilePassword(std::string const& parameter) |
| 156 | { | 149 | { |
| 157 | o.m->encryption_file_password = QUtil::make_shared_cstr(parameter); | 150 | o.m->encryption_file_password = QUtil::make_shared_cstr(parameter); |
libqpdf/qpdf/auto_job_help.hh
| @@ -157,15 +157,10 @@ encrypted. Normally qpdf preserves whatever encryption was | @@ -157,15 +157,10 @@ encrypted. Normally qpdf preserves whatever encryption was | ||
| 157 | present on the input file. This option overrides that behavior. | 157 | present on the input file. This option overrides that behavior. |
| 158 | )"); | 158 | )"); |
| 159 | ap.addOptionHelp("--remove-restrictions", "transformation", "remove security restrictions from input file", R"(Remove restrictions associated with digitally signed PDF files. | 159 | ap.addOptionHelp("--remove-restrictions", "transformation", "remove security restrictions from input file", R"(Remove restrictions associated with digitally signed PDF files. |
| 160 | -This may be combined with --decrypt and --disable-signatures to | ||
| 161 | -allow free editing of previously signed/encrypted files. This | ||
| 162 | -option invalidates the signature but leaves its visual | ||
| 163 | -appearance intact. See also --disable-signatures. | ||
| 164 | -)"); | ||
| 165 | -ap.addOptionHelp("--disable-signatures", "transformation", "disable digital signature fields", R"(Remove all digital signature fields from a file. The appearance | ||
| 166 | -of the digital signature, if any, will remain on the page, but | ||
| 167 | -it will no longer be a signature field. See also | ||
| 168 | ---remove-restrictions. | 160 | +This may be combined with --decrypt to allow free editing of |
| 161 | +previously signed/encrypted files. This option invalidates and | ||
| 162 | +disables any digital signatures but leaves their visual | ||
| 163 | +appearances intact. | ||
| 169 | )"); | 164 | )"); |
| 170 | ap.addOptionHelp("--copy-encryption", "transformation", "copy another file's encryption details", R"(--copy-encryption=file | 165 | ap.addOptionHelp("--copy-encryption", "transformation", "copy another file's encryption details", R"(--copy-encryption=file |
| 171 | 166 | ||
| @@ -173,14 +168,14 @@ Copy encryption details from the specified file instead of | @@ -173,14 +168,14 @@ Copy encryption details from the specified file instead of | ||
| 173 | preserving the input file's encryption. Use --encryption-file-password | 168 | preserving the input file's encryption. Use --encryption-file-password |
| 174 | to specify the encryption file's password. | 169 | to specify the encryption file's password. |
| 175 | )"); | 170 | )"); |
| 176 | -} | ||
| 177 | -static void add_help_3(QPDFArgParser& ap) | ||
| 178 | -{ | ||
| 179 | ap.addOptionHelp("--encryption-file-password", "transformation", "supply password for --copy-encryption", R"(--encryption-file-password=password | 171 | ap.addOptionHelp("--encryption-file-password", "transformation", "supply password for --copy-encryption", R"(--encryption-file-password=password |
| 180 | 172 | ||
| 181 | If the file named in --copy-encryption requires a password, use | 173 | If the file named in --copy-encryption requires a password, use |
| 182 | this option to supply the password. | 174 | this option to supply the password. |
| 183 | )"); | 175 | )"); |
| 176 | +} | ||
| 177 | +static void add_help_3(QPDFArgParser& ap) | ||
| 178 | +{ | ||
| 184 | ap.addOptionHelp("--qdf", "transformation", "enable viewing PDF code in a text editor", R"(Create a PDF file suitable for viewing in a text editor and even | 179 | ap.addOptionHelp("--qdf", "transformation", "enable viewing PDF code in a text editor", R"(Create a PDF file suitable for viewing in a text editor and even |
| 185 | editing. This is for editing the PDF code, not the page contents. | 180 | editing. This is for editing the PDF code, not the page contents. |
| 186 | All streams that can be uncompressed are uncompressed, and | 181 | All streams that can be uncompressed are uncompressed, and |
| @@ -290,9 +285,6 @@ Force the output PDF file's PDF version header to be the specified | @@ -290,9 +285,6 @@ Force the output PDF file's PDF version header to be the specified | ||
| 290 | value, even if the file uses features that may not be available | 285 | value, even if the file uses features that may not be available |
| 291 | in that version. | 286 | in that version. |
| 292 | )"); | 287 | )"); |
| 293 | -} | ||
| 294 | -static void add_help_4(QPDFArgParser& ap) | ||
| 295 | -{ | ||
| 296 | ap.addHelpTopic("page-ranges", "page range syntax", R"(A full description of the page range syntax, with examples, can be | 288 | ap.addHelpTopic("page-ranges", "page range syntax", R"(A full description of the page range syntax, with examples, can be |
| 297 | found in the manual. Summary: | 289 | found in the manual. Summary: |
| 298 | 290 | ||
| @@ -306,6 +298,9 @@ resulting set of pages, where :odd starts with the first page and | @@ -306,6 +298,9 @@ resulting set of pages, where :odd starts with the first page and | ||
| 306 | :even starts with the second page. These are odd and even pages | 298 | :even starts with the second page. These are odd and even pages |
| 307 | from the resulting set, not based on the original page numbers. | 299 | from the resulting set, not based on the original page numbers. |
| 308 | )"); | 300 | )"); |
| 301 | +} | ||
| 302 | +static void add_help_4(QPDFArgParser& ap) | ||
| 303 | +{ | ||
| 309 | ap.addHelpTopic("modification", "change parts of the PDF", R"(Modification options make systematic changes to certain parts of | 304 | ap.addHelpTopic("modification", "change parts of the PDF", R"(Modification options make systematic changes to certain parts of |
| 310 | the PDF, causing the PDF to render differently from the original. | 305 | the PDF, causing the PDF to render differently from the original. |
| 311 | )"); | 306 | )"); |
| @@ -481,13 +476,13 @@ ap.addOptionHelp("--user-password", "encryption", "specify user password", R"(-- | @@ -481,13 +476,13 @@ ap.addOptionHelp("--user-password", "encryption", "specify user password", R"(-- | ||
| 481 | 476 | ||
| 482 | Set the user password of the encrypted file. | 477 | Set the user password of the encrypted file. |
| 483 | )"); | 478 | )"); |
| 484 | -} | ||
| 485 | -static void add_help_5(QPDFArgParser& ap) | ||
| 486 | -{ | ||
| 487 | ap.addOptionHelp("--owner-password", "encryption", "specify owner password", R"(--owner-password=owner-password | 479 | ap.addOptionHelp("--owner-password", "encryption", "specify owner password", R"(--owner-password=owner-password |
| 488 | 480 | ||
| 489 | Set the owner password of the encrypted file. | 481 | Set the owner password of the encrypted file. |
| 490 | )"); | 482 | )"); |
| 483 | +} | ||
| 484 | +static void add_help_5(QPDFArgParser& ap) | ||
| 485 | +{ | ||
| 491 | ap.addOptionHelp("--bits", "encryption", "specify encryption key length", R"(--bits={48|128|256} | 486 | ap.addOptionHelp("--bits", "encryption", "specify encryption key length", R"(--bits={48|128|256} |
| 492 | 487 | ||
| 493 | Specify the encryption key length. For best security, always use | 488 | Specify the encryption key length. For best security, always use |
| @@ -659,15 +654,15 @@ the destination pages. See qpdf --help=page-ranges for help | @@ -659,15 +654,15 @@ the destination pages. See qpdf --help=page-ranges for help | ||
| 659 | with the page range syntax. The page range may be omitted | 654 | with the page range syntax. The page range may be omitted |
| 660 | if --repeat is used. | 655 | if --repeat is used. |
| 661 | )"); | 656 | )"); |
| 662 | -} | ||
| 663 | -static void add_help_6(QPDFArgParser& ap) | ||
| 664 | -{ | ||
| 665 | ap.addOptionHelp("--repeat", "overlay-underlay", "overlay/underlay pages to repeat", R"(--repeat=page-range | 657 | ap.addOptionHelp("--repeat", "overlay-underlay", "overlay/underlay pages to repeat", R"(--repeat=page-range |
| 666 | 658 | ||
| 667 | Specify pages from the overlay/underlay that are repeated after | 659 | Specify pages from the overlay/underlay that are repeated after |
| 668 | "from" pages have been exhausted. See qpdf --help=page-ranges | 660 | "from" pages have been exhausted. See qpdf --help=page-ranges |
| 669 | for help with the page range syntax. | 661 | for help with the page range syntax. |
| 670 | )"); | 662 | )"); |
| 663 | +} | ||
| 664 | +static void add_help_6(QPDFArgParser& ap) | ||
| 665 | +{ | ||
| 671 | ap.addHelpTopic("attachments", "work with embedded files", R"(It is possible to list, add, or delete embedded files (also known | 666 | ap.addHelpTopic("attachments", "work with embedded files", R"(It is possible to list, add, or delete embedded files (also known |
| 672 | as attachments) and to copy attachments from other files. See help | 667 | as attachments) and to copy attachments from other files. See help |
| 673 | on individual options for details. Run qpdf --help=add-attachment | 668 | on individual options for details. Run qpdf --help=add-attachment |
| @@ -776,9 +771,6 @@ ap.addOptionHelp("--requires-password", "inspection", "silently test a file's pa | @@ -776,9 +771,6 @@ ap.addOptionHelp("--requires-password", "inspection", "silently test a file's pa | ||
| 776 | 2: the file is not encrypted | 771 | 2: the file is not encrypted |
| 777 | 3: the file is encrypted, and correct password (if any) has been supplied | 772 | 3: the file is encrypted, and correct password (if any) has been supplied |
| 778 | )"); | 773 | )"); |
| 779 | -} | ||
| 780 | -static void add_help_7(QPDFArgParser& ap) | ||
| 781 | -{ | ||
| 782 | ap.addOptionHelp("--check", "inspection", "partially check whether PDF is valid", R"(Check the structure of the PDF file as well as a number of other | 774 | ap.addOptionHelp("--check", "inspection", "partially check whether PDF is valid", R"(Check the structure of the PDF file as well as a number of other |
| 783 | aspects of the file, and write information about the file to | 775 | aspects of the file, and write information about the file to |
| 784 | standard output. Note that qpdf does not perform any validation | 776 | standard output. Note that qpdf does not perform any validation |
| @@ -786,6 +778,9 @@ of the actual PDF page content or semantic correctness of the | @@ -786,6 +778,9 @@ of the actual PDF page content or semantic correctness of the | ||
| 786 | PDF file. It merely checks that the PDF file is syntactically | 778 | PDF file. It merely checks that the PDF file is syntactically |
| 787 | valid. See also qpdf --help=exit-status. | 779 | valid. See also qpdf --help=exit-status. |
| 788 | )"); | 780 | )"); |
| 781 | +} | ||
| 782 | +static void add_help_7(QPDFArgParser& ap) | ||
| 783 | +{ | ||
| 789 | ap.addOptionHelp("--show-encryption", "inspection", "information about encrypted files", R"(Show document encryption parameters. Also show the document's | 784 | ap.addOptionHelp("--show-encryption", "inspection", "information about encrypted files", R"(Show document encryption parameters. Also show the document's |
| 790 | user password if the owner password is given and the file was | 785 | user password if the owner password is given and the file was |
| 791 | encrypted using older encryption formats that allow user | 786 | encrypted using older encryption formats that allow user |
| @@ -866,9 +861,6 @@ This option is repeatable. If given, only specified objects will | @@ -866,9 +861,6 @@ This option is repeatable. If given, only specified objects will | ||
| 866 | be shown in the "objects" key of the JSON output. Otherwise, all | 861 | be shown in the "objects" key of the JSON output. Otherwise, all |
| 867 | objects will be shown. | 862 | objects will be shown. |
| 868 | )"); | 863 | )"); |
| 869 | -} | ||
| 870 | -static void add_help_8(QPDFArgParser& ap) | ||
| 871 | -{ | ||
| 872 | ap.addOptionHelp("--json-stream-data", "json", "how to handle streams in json output", R"(--json-stream-data={none|inline|file} | 864 | ap.addOptionHelp("--json-stream-data", "json", "how to handle streams in json output", R"(--json-stream-data={none|inline|file} |
| 873 | 865 | ||
| 874 | When used with --json, this option controls whether streams in | 866 | When used with --json, this option controls whether streams in |
| @@ -880,6 +872,9 @@ object number. The prefix can be overridden with | @@ -880,6 +872,9 @@ object number. The prefix can be overridden with | ||
| 880 | when --json-output is specified, in which case the default is | 872 | when --json-output is specified, in which case the default is |
| 881 | "inline". | 873 | "inline". |
| 882 | )"); | 874 | )"); |
| 875 | +} | ||
| 876 | +static void add_help_8(QPDFArgParser& ap) | ||
| 877 | +{ | ||
| 883 | ap.addOptionHelp("--json-stream-prefix", "json", "prefix for json stream data files", R"(--json-stream-prefix=file-prefix | 878 | ap.addOptionHelp("--json-stream-prefix", "json", "prefix for json stream data files", R"(--json-stream-prefix=file-prefix |
| 884 | 879 | ||
| 885 | When used with --json-stream-data=file, --json-stream-data=file-prefix | 880 | When used with --json-stream-data=file, --json-stream-data=file-prefix |
libqpdf/qpdf/auto_job_init.hh
| @@ -43,7 +43,6 @@ this->ap.addBare("coalesce-contents", [this](){c_main->coalesceContents();}); | @@ -43,7 +43,6 @@ this->ap.addBare("coalesce-contents", [this](){c_main->coalesceContents();}); | ||
| 43 | this->ap.addBare("copy-attachments-from", b(&ArgParser::argCopyAttachmentsFrom)); | 43 | this->ap.addBare("copy-attachments-from", b(&ArgParser::argCopyAttachmentsFrom)); |
| 44 | this->ap.addBare("decrypt", [this](){c_main->decrypt();}); | 44 | this->ap.addBare("decrypt", [this](){c_main->decrypt();}); |
| 45 | this->ap.addBare("deterministic-id", [this](){c_main->deterministicId();}); | 45 | this->ap.addBare("deterministic-id", [this](){c_main->deterministicId();}); |
| 46 | -this->ap.addBare("disable-signatures", [this](){c_main->disableSignatures();}); | ||
| 47 | this->ap.addBare("empty", b(&ArgParser::argEmpty)); | 46 | this->ap.addBare("empty", b(&ArgParser::argEmpty)); |
| 48 | this->ap.addBare("encrypt", b(&ArgParser::argEncrypt)); | 47 | this->ap.addBare("encrypt", b(&ArgParser::argEncrypt)); |
| 49 | this->ap.addBare("externalize-inline-images", [this](){c_main->externalizeInlineImages();}); | 48 | this->ap.addBare("externalize-inline-images", [this](){c_main->externalizeInlineImages();}); |
libqpdf/qpdf/auto_job_json_init.hh
| @@ -71,9 +71,6 @@ popHandler(); // key: decrypt | @@ -71,9 +71,6 @@ popHandler(); // key: decrypt | ||
| 71 | pushKey("deterministicId"); | 71 | pushKey("deterministicId"); |
| 72 | addBare([this]() { c_main->deterministicId(); }); | 72 | addBare([this]() { c_main->deterministicId(); }); |
| 73 | popHandler(); // key: deterministicId | 73 | popHandler(); // key: deterministicId |
| 74 | -pushKey("disableSignatures"); | ||
| 75 | -addBare([this]() { c_main->disableSignatures(); }); | ||
| 76 | -popHandler(); // key: disableSignatures | ||
| 77 | pushKey("staticAesIv"); | 74 | pushKey("staticAesIv"); |
| 78 | addBare([this]() { c_main->staticAesIv(); }); | 75 | addBare([this]() { c_main->staticAesIv(); }); |
| 79 | popHandler(); // key: staticAesIv | 76 | popHandler(); // key: staticAesIv |
libqpdf/qpdf/auto_job_schema.hh
| @@ -16,7 +16,6 @@ static constexpr char const* JOB_SCHEMA_DATA = R"({ | @@ -16,7 +16,6 @@ static constexpr char const* JOB_SCHEMA_DATA = R"({ | ||
| 16 | "decodeLevel": "control which streams to uncompress", | 16 | "decodeLevel": "control which streams to uncompress", |
| 17 | "decrypt": "remove encryption from input file", | 17 | "decrypt": "remove encryption from input file", |
| 18 | "deterministicId": "generate ID deterministically", | 18 | "deterministicId": "generate ID deterministically", |
| 19 | - "disableSignatures": "disable digital signature fields", | ||
| 20 | "staticAesIv": "use a fixed AES vector", | 19 | "staticAesIv": "use a fixed AES vector", |
| 21 | "staticId": "use a fixed document ID", | 20 | "staticId": "use a fixed document ID", |
| 22 | "noOriginalObjectIds": "omit original object IDs in qdf", | 21 | "noOriginalObjectIds": "omit original object IDs in qdf", |
manual/cli.rst
| @@ -736,40 +736,24 @@ Related Options | @@ -736,40 +736,24 @@ Related Options | ||
| 736 | whatever encryption was present on the input file. This | 736 | whatever encryption was present on the input file. This |
| 737 | functionality is not intended to be used for bypassing copyright | 737 | functionality is not intended to be used for bypassing copyright |
| 738 | restrictions or other restrictions placed on files by their | 738 | restrictions or other restrictions placed on files by their |
| 739 | - producers. See also :qpdf:ref:`--copy-encryption`, | ||
| 740 | - :qpdf:ref:`--remove-restrictions`, and | ||
| 741 | - :qpdf:ref:`--disable-signatures`. | 739 | + producers. See also :qpdf:ref:`--copy-encryption` and |
| 740 | + :qpdf:ref:`--remove-restrictions`. | ||
| 742 | 741 | ||
| 743 | .. qpdf:option:: --remove-restrictions | 742 | .. qpdf:option:: --remove-restrictions |
| 744 | 743 | ||
| 745 | .. help: remove security restrictions from input file | 744 | .. help: remove security restrictions from input file |
| 746 | 745 | ||
| 747 | Remove restrictions associated with digitally signed PDF files. | 746 | Remove restrictions associated with digitally signed PDF files. |
| 748 | - This may be combined with --decrypt and --disable-signatures to | ||
| 749 | - allow free editing of previously signed/encrypted files. This | ||
| 750 | - option invalidates the signature but leaves its visual | ||
| 751 | - appearance intact. See also --disable-signatures. | 747 | + This may be combined with --decrypt to allow free editing of |
| 748 | + previously signed/encrypted files. This option invalidates and | ||
| 749 | + disables any digital signatures but leaves their visual | ||
| 750 | + appearances intact. | ||
| 752 | 751 | ||
| 753 | Remove security restrictions associated with digitally signed PDF | 752 | Remove security restrictions associated with digitally signed PDF |
| 754 | - files. This may be combined with :qpdf:ref:`--decrypt` and | ||
| 755 | - :qpdf:ref:`--disable-signatures` to allow free editing of | ||
| 756 | - previously signed/encrypted files. This option invalidates the | ||
| 757 | - signature but leaves its visual appearance intact. See also | ||
| 758 | - :qpdf:ref:`--disable-signatures`. | ||
| 759 | - | ||
| 760 | -.. qpdf:option:: --disable-signatures | ||
| 761 | - | ||
| 762 | - .. help: disable digital signature fields | ||
| 763 | - | ||
| 764 | - Remove all digital signature fields from a file. The appearance | ||
| 765 | - of the digital signature, if any, will remain on the page, but | ||
| 766 | - it will no longer be a signature field. See also | ||
| 767 | - --remove-restrictions. | ||
| 768 | - | ||
| 769 | - Remove all digital signature fields from a file. The appearance | ||
| 770 | - of the digital signature, if any, will remain on the page, but | ||
| 771 | - it will no longer be a signature field. See also | ||
| 772 | - :qpdf:ref:`--remove-restrictions`. | 753 | + files. This may be combined with :qpdf:ref:`--decrypt` to allow |
| 754 | + free editing of previously signed/encrypted files. This option | ||
| 755 | + invalidates and disables any digital signatures but leaves their | ||
| 756 | + visual appearances intact. | ||
| 773 | 757 | ||
| 774 | .. qpdf:option:: --copy-encryption=file | 758 | .. qpdf:option:: --copy-encryption=file |
| 775 | 759 |
manual/qpdf.1
| @@ -221,16 +221,10 @@ present on the input file. This option overrides that behavior. | @@ -221,16 +221,10 @@ present on the input file. This option overrides that behavior. | ||
| 221 | .TP | 221 | .TP |
| 222 | .B --remove-restrictions \-\- remove security restrictions from input file | 222 | .B --remove-restrictions \-\- remove security restrictions from input file |
| 223 | Remove restrictions associated with digitally signed PDF files. | 223 | Remove restrictions associated with digitally signed PDF files. |
| 224 | -This may be combined with --decrypt and --disable-signatures to | ||
| 225 | -allow free editing of previously signed/encrypted files. This | ||
| 226 | -option invalidates the signature but leaves its visual | ||
| 227 | -appearance intact. See also --disable-signatures. | ||
| 228 | -.TP | ||
| 229 | -.B --disable-signatures \-\- disable digital signature fields | ||
| 230 | -Remove all digital signature fields from a file. The appearance | ||
| 231 | -of the digital signature, if any, will remain on the page, but | ||
| 232 | -it will no longer be a signature field. See also | ||
| 233 | ---remove-restrictions. | 224 | +This may be combined with --decrypt to allow free editing of |
| 225 | +previously signed/encrypted files. This option invalidates and | ||
| 226 | +disables any digital signatures but leaves their visual | ||
| 227 | +appearances intact. | ||
| 234 | .TP | 228 | .TP |
| 235 | .B --copy-encryption \-\- copy another file's encryption details | 229 | .B --copy-encryption \-\- copy another file's encryption details |
| 236 | --copy-encryption=file | 230 | --copy-encryption=file |
manual/release-notes.rst
| @@ -71,10 +71,8 @@ Planned changes for future 12.x (subject to change): | @@ -71,10 +71,8 @@ Planned changes for future 12.x (subject to change): | ||
| 71 | shell completion and allows creation of passwords that start | 71 | shell completion and allows creation of passwords that start |
| 72 | with ``-``. | 72 | with ``-``. |
| 73 | 73 | ||
| 74 | - - Add ``QPDFAcroFormDocumentHelper::disableDigitalSignatures`` and | ||
| 75 | - the :qpdf:ref:`--disable-signatures` command-line argument. This | ||
| 76 | - disables any digital signature fields, leaving their visual | ||
| 77 | - representations intact. | 74 | + - :qpdf:ref:`--remove-restrictions` flag now also disables |
| 75 | + digital signatures in the file. | ||
| 78 | 76 | ||
| 79 | - Build Enhancements: | 77 | - Build Enhancements: |
| 80 | 78 | ||
| @@ -102,6 +100,10 @@ Planned changes for future 12.x (subject to change): | @@ -102,6 +100,10 @@ Planned changes for future 12.x (subject to change): | ||
| 102 | - Add methods to ``Buffer`` to work more easily and efficiently | 100 | - Add methods to ``Buffer`` to work more easily and efficiently |
| 103 | with ``std::string``. | 101 | with ``std::string``. |
| 104 | 102 | ||
| 103 | + - Add ``QPDFAcroFormDocumentHelper::disableDigitalSignatures``, | ||
| 104 | + which disables any digital signature fields, leaving their | ||
| 105 | + visual representations intact. | ||
| 106 | + | ||
| 105 | 11.6.4: December 10, 2023 | 107 | 11.6.4: December 10, 2023 |
| 106 | - Bug fixes: | 108 | - Bug fixes: |
| 107 | 109 |
qpdf/qtest/qpdf/minimal-signed-restricted.pdf
No preview for this file type
qpdf/qtest/qpdf/minimal-signed-restrictions-removed.pdf
No preview for this file type