aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--include/qpdf/Constants.h15
-rw-r--r--include/qpdf/QPDFWriter.hh38
-rw-r--r--include/qpdf/qpdf-c.h34
-rw-r--r--libqpdf/QPDFWriter.cc133
-rw-r--r--libqpdf/qpdf-c.cc70
-rw-r--r--qpdf/qpdf-ctest.c20
-rw-r--r--qpdf/qpdf.cc58
8 files changed, 339 insertions, 38 deletions
diff --git a/ChangeLog b/ChangeLog
index 7ff658c7..1feaffb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,6 +16,15 @@
2019-01-14 Jay Berkenbilt <ejb@ql.org>
+ * Add new versions of
+ QPDFWriter::setR{3,4,5,6}EncryptionParameters that allow
+ individual setting of the various permission bits. The old
+ interfaces are retained for backward compatibility. In the "C"
+ API, add qpdf_set_r{3,4,5,6}_encryption_parameters2. The new
+ interfaces use separate booleans for various permissions instead
+ of the qpdf_r3_modify_e enumerated type, which set permission bits
+ in predefined groups.
+
* Add versions of utf8 to single-byte character transcoders that
return a success code.
diff --git a/include/qpdf/Constants.h b/include/qpdf/Constants.h
index 830d4e8f..1428216c 100644
--- a/include/qpdf/Constants.h
+++ b/include/qpdf/Constants.h
@@ -80,13 +80,18 @@ enum qpdf_r3_print_e
qpdf_r3p_low, /* allow only low-resolution printing */
qpdf_r3p_none /* allow no printing */
};
+
+/* qpdf_r3_modify_e doesn't allow the full flexibility of the spec. It
+ * corresponds to options in Acrobat 5's menus. The new interface in
+ * QPDFWriter offers more granularity and no longer uses this type.
+ */
enum qpdf_r3_modify_e /* Allowed changes: */
{
- qpdf_r3m_all = 0, /* General editing, comments, forms */
- qpdf_r3m_annotate, /* Comments, form field fill-in, and signing */
- qpdf_r3m_form, /* form field fill-in and signing */
- qpdf_r3m_assembly, /* only document assembly */
- qpdf_r3m_none /* no modifications */
+ qpdf_r3m_all = 0, /* All editing */
+ qpdf_r3m_annotate, /* Comments, fill forms, signing, assembly */
+ qpdf_r3m_form, /* Fill forms, signing, assembly */
+ qpdf_r3m_assembly, /* Only document assembly */
+ qpdf_r3m_none /* No modifications */
};
/* Form field flags from the PDF spec */
diff --git a/include/qpdf/QPDFWriter.hh b/include/qpdf/QPDFWriter.hh
index 564a7e2c..885a3630 100644
--- a/include/qpdf/QPDFWriter.hh
+++ b/include/qpdf/QPDFWriter.hh
@@ -344,6 +344,39 @@ class QPDFWriter
// AES is used, 1.6, and setting R5 or R6 parameters pushes the
// version to at least 1.7 with extension level 3.
QPDF_DLL
+ void setR3EncryptionParameters(
+ char const* user_password, char const* owner_password,
+ bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
+ qpdf_r3_print_e print);
+ QPDF_DLL
+ void setR4EncryptionParameters(
+ char const* user_password, char const* owner_password,
+ bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
+ qpdf_r3_print_e print, bool encrypt_metadata, bool use_aes);
+ // R5 is deprecated. Do not use it for production use. Writing
+ // R5 is supported by qpdf primarily to generate test files for
+ // applications that may need to test R5 support.
+ QPDF_DLL
+ void setR5EncryptionParameters(
+ char const* user_password, char const* owner_password,
+ bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
+ qpdf_r3_print_e print, bool encrypt_metadata);
+ QPDF_DLL
+ void setR6EncryptionParameters(
+ char const* user_password, char const* owner_password,
+ bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
+ qpdf_r3_print_e print, bool encrypt_metadata_aes);
+
+ // Pre qpdf 8.4.0 API
+ QPDF_DLL
void setR2EncryptionParameters(
char const* user_password, char const* owner_password,
bool allow_print, bool allow_modify,
@@ -359,9 +392,6 @@ class QPDFWriter
bool allow_accessibility, bool allow_extract,
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
bool encrypt_metadata, bool use_aes);
- // R5 is deprecated. Do not use it for production use. Writing
- // R5 is supported by qpdf primarily to generate test files for
- // applications that may need to test R5 support.
QPDF_DLL
void setR5EncryptionParameters(
char const* user_password, char const* owner_password,
@@ -459,6 +489,8 @@ class QPDFWriter
std::set<int>& bits_to_clear,
char const* user_password, char const* owner_password,
bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
qpdf_r3_print_e print, qpdf_r3_modify_e modify);
void disableIncompatibleEncryption(int major, int minor,
int extension_level);
diff --git a/include/qpdf/qpdf-c.h b/include/qpdf/qpdf-c.h
index 3e526cc8..c0983a53 100644
--- a/include/qpdf/qpdf-c.h
+++ b/include/qpdf/qpdf-c.h
@@ -390,6 +390,40 @@ extern "C" {
QPDF_BOOL allow_extract, QPDF_BOOL allow_annotate);
QPDF_DLL
+ void qpdf_set_r3_encryption_parameters2(
+ qpdf_data qpdf, char const* user_password, char const* owner_password,
+ QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
+ QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
+ QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
+ enum qpdf_r3_print_e print);
+
+ QPDF_DLL
+ void qpdf_set_r4_encryption_parameters2(
+ qpdf_data qpdf, char const* user_password, char const* owner_password,
+ QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
+ QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
+ QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
+ enum qpdf_r3_print_e print,
+ QPDF_BOOL encrypt_metadata, QPDF_BOOL use_aes);
+
+ QPDF_DLL
+ void qpdf_set_r5_encryption_parameters2(
+ qpdf_data qpdf, char const* user_password, char const* owner_password,
+ QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
+ QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
+ QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
+ enum qpdf_r3_print_e print, QPDF_BOOL encrypt_metadata);
+
+ QPDF_DLL
+ void qpdf_set_r6_encryption_parameters2(
+ qpdf_data qpdf, char const* user_password, char const* owner_password,
+ QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
+ QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
+ QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
+ enum qpdf_r3_print_e print, QPDF_BOOL encrypt_metadata);
+
+ /* Pre 8.4.0 encryption API */
+ QPDF_DLL
void qpdf_set_r3_encryption_parameters(
qpdf_data qpdf, char const* user_password, char const* owner_password,
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc
index 598d4654..c549728d 100644
--- a/libqpdf/QPDFWriter.cc
+++ b/libqpdf/QPDFWriter.cc
@@ -409,7 +409,26 @@ QPDFWriter::setR3EncryptionParameters(
std::set<int> clear;
interpretR3EncryptionParameters(
clear, user_password, owner_password,
- allow_accessibility, allow_extract, print, modify);
+ allow_accessibility, allow_extract,
+ true, true, true, true, print, modify);
+ setEncryptionParameters(user_password, owner_password, 2, 3, 16, clear);
+}
+
+void
+QPDFWriter::setR3EncryptionParameters(
+ char const* user_password, char const* owner_password,
+ bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
+ qpdf_r3_print_e print)
+{
+ std::set<int> clear;
+ interpretR3EncryptionParameters(
+ clear, user_password, owner_password,
+ allow_accessibility, allow_extract,
+ allow_assemble, allow_annotate_and_form,
+ allow_form_filling, allow_modify_other,
+ print, qpdf_r3m_all);
setEncryptionParameters(user_password, owner_password, 2, 3, 16, clear);
}
@@ -423,7 +442,29 @@ QPDFWriter::setR4EncryptionParameters(
std::set<int> clear;
interpretR3EncryptionParameters(
clear, user_password, owner_password,
- allow_accessibility, allow_extract, print, modify);
+ allow_accessibility, allow_extract,
+ true, true, true, true, print, modify);
+ this->m->encrypt_use_aes = use_aes;
+ this->m->encrypt_metadata = encrypt_metadata;
+ setEncryptionParameters(user_password, owner_password, 4, 4, 16, clear);
+}
+
+void
+QPDFWriter::setR4EncryptionParameters(
+ char const* user_password, char const* owner_password,
+ bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
+ qpdf_r3_print_e print,
+ bool encrypt_metadata, bool use_aes)
+{
+ std::set<int> clear;
+ interpretR3EncryptionParameters(
+ clear, user_password, owner_password,
+ allow_accessibility, allow_extract,
+ allow_assemble, allow_annotate_and_form,
+ allow_form_filling, allow_modify_other,
+ print, qpdf_r3m_all);
this->m->encrypt_use_aes = use_aes;
this->m->encrypt_metadata = encrypt_metadata;
setEncryptionParameters(user_password, owner_password, 4, 4, 16, clear);
@@ -439,7 +480,29 @@ QPDFWriter::setR5EncryptionParameters(
std::set<int> clear;
interpretR3EncryptionParameters(
clear, user_password, owner_password,
- allow_accessibility, allow_extract, print, modify);
+ allow_accessibility, allow_extract,
+ true, true, true, true, print, modify);
+ this->m->encrypt_use_aes = true;
+ this->m->encrypt_metadata = encrypt_metadata;
+ setEncryptionParameters(user_password, owner_password, 5, 5, 32, clear);
+}
+
+void
+QPDFWriter::setR5EncryptionParameters(
+ char const* user_password, char const* owner_password,
+ bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
+ qpdf_r3_print_e print,
+ bool encrypt_metadata)
+{
+ std::set<int> clear;
+ interpretR3EncryptionParameters(
+ clear, user_password, owner_password,
+ allow_accessibility, allow_extract,
+ allow_assemble, allow_annotate_and_form,
+ allow_form_filling, allow_modify_other,
+ print, qpdf_r3m_all);
this->m->encrypt_use_aes = true;
this->m->encrypt_metadata = encrypt_metadata;
setEncryptionParameters(user_password, owner_password, 5, 5, 32, clear);
@@ -455,7 +518,29 @@ QPDFWriter::setR6EncryptionParameters(
std::set<int> clear;
interpretR3EncryptionParameters(
clear, user_password, owner_password,
- allow_accessibility, allow_extract, print, modify);
+ allow_accessibility, allow_extract,
+ true, true, true, true, print, modify);
+ this->m->encrypt_use_aes = true;
+ this->m->encrypt_metadata = encrypt_metadata;
+ setEncryptionParameters(user_password, owner_password, 5, 6, 32, clear);
+}
+
+void
+QPDFWriter::setR6EncryptionParameters(
+ char const* user_password, char const* owner_password,
+ bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
+ qpdf_r3_print_e print,
+ bool encrypt_metadata)
+{
+ std::set<int> clear;
+ interpretR3EncryptionParameters(
+ clear, user_password, owner_password,
+ allow_accessibility, allow_extract,
+ allow_assemble, allow_annotate_and_form,
+ allow_form_filling, allow_modify_other,
+ print, qpdf_r3m_all);
this->m->encrypt_use_aes = true;
this->m->encrypt_metadata = encrypt_metadata;
setEncryptionParameters(user_password, owner_password, 5, 6, 32, clear);
@@ -466,6 +551,8 @@ QPDFWriter::interpretR3EncryptionParameters(
std::set<int>& clear,
char const* user_password, char const* owner_password,
bool allow_accessibility, bool allow_extract,
+ bool allow_assemble, bool allow_annotate_and_form,
+ bool allow_form_filling, bool allow_modify_other,
qpdf_r3_print_e print, qpdf_r3_modify_e modify)
{
// Acrobat 5 security options:
@@ -486,8 +573,21 @@ QPDFWriter::interpretR3EncryptionParameters(
// Low Resolution
// Full printing
+ // Meanings of bits in P when R >= 3
+ //
+ // 3: low-resolution printing
+ // 4: document modification except as controlled by 6, 9, and 11
+ // 5: extraction
+ // 6: add/modify annotations (comment), fill in forms
+ // if 4+6 are set, also allows modification of form fields
+ // 9: fill in forms even if 6 is clear
+ // 10: accessibility; ignored by readers, should always be set
+ // 11: document assembly even if 4 is clear
+ // 12: high-resolution printing
+
if (! allow_accessibility)
{
+ // setEncryptionParameters sets this if R > 3
clear.insert(10);
}
if (! allow_extract)
@@ -511,6 +611,13 @@ QPDFWriter::interpretR3EncryptionParameters(
// no default so gcc warns for missing cases
}
+ // Modify options. The qpdf_r3_modify_e options control groups of
+ // bits and lack the full flexibility of the spec. This is
+ // unfortunate, but it's been in the API for ages, and we're stuck
+ // with it. See also allow checks below to control the bits
+ // individually.
+
+ // NOT EXERCISED IN TEST SUITE
switch (modify)
{
case qpdf_r3m_none:
@@ -530,6 +637,24 @@ QPDFWriter::interpretR3EncryptionParameters(
// no default so gcc warns for missing cases
}
+ // END NOT EXERCISED IN TEST SUITE
+
+ if (! allow_assemble)
+ {
+ clear.insert(11);
+ }
+ if (! allow_annotate_and_form)
+ {
+ clear.insert(6);
+ }
+ if (! allow_form_filling)
+ {
+ clear.insert(9);
+ }
+ if (! allow_modify_other)
+ {
+ clear.insert(4);
+ }
}
void
diff --git a/libqpdf/qpdf-c.cc b/libqpdf/qpdf-c.cc
index 1cc1e2b1..310bb7d0 100644
--- a/libqpdf/qpdf-c.cc
+++ b/libqpdf/qpdf-c.cc
@@ -603,12 +603,77 @@ void qpdf_set_r2_encryption_parameters(
allow_print, allow_modify, allow_extract, allow_annotate);
}
+void qpdf_set_r3_encryption_parameters2(
+ qpdf_data qpdf, char const* user_password, char const* owner_password,
+ QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
+ QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
+ QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
+ enum qpdf_r3_print_e print)
+{
+ QTC::TC("qpdf", "qpdf-c called qpdf_set_r3_encryption_parameters");
+ qpdf->qpdf_writer->setR3EncryptionParameters(
+ user_password, owner_password,
+ allow_accessibility, allow_extract,
+ allow_assemble, allow_annotate_and_form,
+ allow_form_filling, allow_modify_other,
+ print);
+}
+
+void qpdf_set_r4_encryption_parameters2(
+ qpdf_data qpdf, char const* user_password, char const* owner_password,
+ QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
+ QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
+ QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
+ enum qpdf_r3_print_e print,
+ QPDF_BOOL encrypt_metadata, QPDF_BOOL use_aes)
+{
+ QTC::TC("qpdf", "qpdf-c called qpdf_set_r4_encryption_parameters");
+ qpdf->qpdf_writer->setR4EncryptionParameters(
+ user_password, owner_password,
+ allow_accessibility, allow_extract,
+ allow_assemble, allow_annotate_and_form,
+ allow_form_filling, allow_modify_other,
+ print, encrypt_metadata, use_aes);
+}
+
+
+void qpdf_set_r5_encryption_parameters2(
+ qpdf_data qpdf, char const* user_password, char const* owner_password,
+ QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
+ QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
+ QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
+ enum qpdf_r3_print_e print, QPDF_BOOL encrypt_metadata)
+{
+ QTC::TC("qpdf", "qpdf-c called qpdf_set_r5_encryption_parameters");
+ qpdf->qpdf_writer->setR5EncryptionParameters(
+ user_password, owner_password,
+ allow_accessibility, allow_extract,
+ allow_assemble, allow_annotate_and_form,
+ allow_form_filling, allow_modify_other,
+ print, encrypt_metadata);
+}
+
+void qpdf_set_r6_encryption_parameters2(
+ qpdf_data qpdf, char const* user_password, char const* owner_password,
+ QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
+ QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
+ QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
+ enum qpdf_r3_print_e print, QPDF_BOOL encrypt_metadata)
+{
+ QTC::TC("qpdf", "qpdf-c called qpdf_set_r6_encryption_parameters");
+ qpdf->qpdf_writer->setR6EncryptionParameters(
+ user_password, owner_password,
+ allow_accessibility, allow_extract,
+ allow_assemble, allow_annotate_and_form,
+ allow_form_filling, allow_modify_other,
+ print, encrypt_metadata);
+}
+
void qpdf_set_r3_encryption_parameters(
qpdf_data qpdf, char const* user_password, char const* owner_password,
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
qpdf_r3_print_e print, qpdf_r3_modify_e modify)
{
- QTC::TC("qpdf", "qpdf-c called qpdf_set_r3_encryption_parameters");
qpdf->qpdf_writer->setR3EncryptionParameters(
user_password, owner_password,
allow_accessibility, allow_extract, print, modify);
@@ -620,7 +685,6 @@ void qpdf_set_r4_encryption_parameters(
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
QPDF_BOOL encrypt_metadata, QPDF_BOOL use_aes)
{
- QTC::TC("qpdf", "qpdf-c called qpdf_set_r4_encryption_parameters");
qpdf->qpdf_writer->setR4EncryptionParameters(
user_password, owner_password,
allow_accessibility, allow_extract, print, modify,
@@ -633,7 +697,6 @@ void qpdf_set_r5_encryption_parameters(
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
QPDF_BOOL encrypt_metadata)
{
- QTC::TC("qpdf", "qpdf-c called qpdf_set_r5_encryption_parameters");
qpdf->qpdf_writer->setR5EncryptionParameters(
user_password, owner_password,
allow_accessibility, allow_extract, print, modify,
@@ -646,7 +709,6 @@ void qpdf_set_r6_encryption_parameters(
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
QPDF_BOOL encrypt_metadata)
{
- QTC::TC("qpdf", "qpdf-c called qpdf_set_r6_encryption_parameters");
qpdf->qpdf_writer->setR6EncryptionParameters(
user_password, owner_password,
allow_accessibility, allow_extract, print, modify,
diff --git a/qpdf/qpdf-ctest.c b/qpdf/qpdf-ctest.c
index 8b9c36ce..6b535796 100644
--- a/qpdf/qpdf-ctest.c
+++ b/qpdf/qpdf-ctest.c
@@ -303,9 +303,10 @@ static void test12(char const* infile,
qpdf_read(qpdf, infile, password);
qpdf_init_write(qpdf, outfile);
qpdf_set_static_ID(qpdf, QPDF_TRUE);
- qpdf_set_r3_encryption_parameters(
+ qpdf_set_r3_encryption_parameters2(
qpdf, "user2", "owner2", QPDF_TRUE, QPDF_TRUE,
- qpdf_r3p_low, qpdf_r3m_all);
+ QPDF_TRUE, QPDF_TRUE, QPDF_TRUE, QPDF_TRUE,
+ qpdf_r3p_low);
qpdf_write(qpdf);
report_errors();
}
@@ -350,9 +351,10 @@ static void test15(char const* infile,
qpdf_init_write(qpdf, outfile);
qpdf_set_static_ID(qpdf, QPDF_TRUE);
qpdf_set_static_aes_IV(qpdf, QPDF_TRUE);
- qpdf_set_r4_encryption_parameters(
+ qpdf_set_r4_encryption_parameters2(
qpdf, "user2", "owner2", QPDF_TRUE, QPDF_TRUE,
- qpdf_r3p_low, qpdf_r3m_all, QPDF_TRUE, QPDF_TRUE);
+ QPDF_TRUE, QPDF_TRUE, QPDF_TRUE, QPDF_TRUE,
+ qpdf_r3p_low, QPDF_TRUE, QPDF_TRUE);
qpdf_write(qpdf);
report_errors();
}
@@ -405,9 +407,10 @@ static void test17(char const* infile,
qpdf_init_write(qpdf, outfile);
qpdf_set_static_ID(qpdf, QPDF_TRUE);
qpdf_set_static_aes_IV(qpdf, QPDF_TRUE);
- qpdf_set_r5_encryption_parameters(
+ qpdf_set_r5_encryption_parameters2(
qpdf, "user3", "owner3", QPDF_TRUE, QPDF_TRUE,
- qpdf_r3p_low, qpdf_r3m_all, QPDF_TRUE);
+ QPDF_TRUE, QPDF_TRUE, QPDF_TRUE, QPDF_TRUE,
+ qpdf_r3p_low, QPDF_TRUE);
qpdf_write(qpdf);
report_errors();
}
@@ -421,9 +424,10 @@ static void test18(char const* infile,
qpdf_init_write(qpdf, outfile);
qpdf_set_static_ID(qpdf, QPDF_TRUE);
qpdf_set_static_aes_IV(qpdf, QPDF_TRUE);
- qpdf_set_r6_encryption_parameters(
+ qpdf_set_r6_encryption_parameters2(
qpdf, "user4", "owner4", QPDF_TRUE, QPDF_TRUE,
- qpdf_r3p_low, qpdf_r3m_all, QPDF_TRUE);
+ QPDF_TRUE, QPDF_TRUE, QPDF_TRUE, QPDF_TRUE,
+ qpdf_r3p_low, QPDF_TRUE);
qpdf_write(qpdf);
report_errors();
}
diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc
index be6e7f56..23ca3d10 100644
--- a/qpdf/qpdf.cc
+++ b/qpdf/qpdf.cc
@@ -80,8 +80,11 @@ struct Options
r2_annotate(true),
r3_accessibility(true),
r3_extract(true),
+ r3_assemble(true),
+ r3_annotate_and_form(true),
+ r3_form_filling(true),
+ r3_modify_other(true),
r3_print(qpdf_r3p_full),
- r3_modify(qpdf_r3m_all),
force_V4(false),
force_R5(false),
cleartext_metadata(false),
@@ -160,8 +163,11 @@ struct Options
bool r2_annotate;
bool r3_accessibility;
bool r3_extract;
+ bool r3_assemble;
+ bool r3_annotate_and_form;
+ bool r3_form_filling;
+ bool r3_modify_other;
qpdf_r3_print_e r3_print;
- qpdf_r3_modify_e r3_modify;
bool force_V4;
bool force_R5;
bool cleartext_metadata;
@@ -1863,23 +1869,38 @@ ArgParser::arg128Modify(char* parameter)
{
if (strcmp(parameter, "all") == 0)
{
- o.r3_modify = qpdf_r3m_all;
+ o.r3_assemble = true;
+ o.r3_annotate_and_form = true;
+ o.r3_form_filling = true;
+ o.r3_modify_other = true;
}
else if (strcmp(parameter, "annotate") == 0)
{
- o.r3_modify = qpdf_r3m_annotate;
+ o.r3_assemble = true;
+ o.r3_annotate_and_form = true;
+ o.r3_form_filling = true;
+ o.r3_modify_other = false;
}
else if (strcmp(parameter, "form") == 0)
{
- o.r3_modify = qpdf_r3m_form;
+ o.r3_assemble = true;
+ o.r3_annotate_and_form = false;
+ o.r3_form_filling = true;
+ o.r3_modify_other = false;
}
else if (strcmp(parameter, "assembly") == 0)
{
- o.r3_modify = qpdf_r3m_assembly;
+ o.r3_assemble = true;
+ o.r3_annotate_and_form = false;
+ o.r3_form_filling = false;
+ o.r3_modify_other = false;
}
else if (strcmp(parameter, "none") == 0)
{
- o.r3_modify = qpdf_r3m_none;
+ o.r3_assemble = false;
+ o.r3_annotate_and_form = false;
+ o.r3_form_filling = false;
+ o.r3_modify_other = false;
}
else
{
@@ -4030,25 +4051,34 @@ static void set_encryption_options(QPDF& pdf, Options& o, QPDFWriter& w)
case 3:
w.setR3EncryptionParameters(
o.user_password.c_str(), o.owner_password.c_str(),
- o.r3_accessibility, o.r3_extract, o.r3_print, o.r3_modify);
+ o.r3_accessibility, o.r3_extract,
+ o.r3_assemble, o.r3_annotate_and_form,
+ o.r3_form_filling, o.r3_modify_other,
+ o.r3_print);
break;
case 4:
w.setR4EncryptionParameters(
o.user_password.c_str(), o.owner_password.c_str(),
- o.r3_accessibility, o.r3_extract, o.r3_print, o.r3_modify,
- !o.cleartext_metadata, o.use_aes);
+ o.r3_accessibility, o.r3_extract,
+ o.r3_assemble, o.r3_annotate_and_form,
+ o.r3_form_filling, o.r3_modify_other,
+ o.r3_print, !o.cleartext_metadata, o.use_aes);
break;
case 5:
w.setR5EncryptionParameters(
o.user_password.c_str(), o.owner_password.c_str(),
- o.r3_accessibility, o.r3_extract, o.r3_print, o.r3_modify,
- !o.cleartext_metadata);
+ o.r3_accessibility, o.r3_extract,
+ o.r3_assemble, o.r3_annotate_and_form,
+ o.r3_form_filling, o.r3_modify_other,
+ o.r3_print, !o.cleartext_metadata);
break;
case 6:
w.setR6EncryptionParameters(
o.user_password.c_str(), o.owner_password.c_str(),
- o.r3_accessibility, o.r3_extract, o.r3_print, o.r3_modify,
- !o.cleartext_metadata);
+ o.r3_accessibility, o.r3_extract,
+ o.r3_assemble, o.r3_annotate_and_form,
+ o.r3_form_filling, o.r3_modify_other,
+ o.r3_print, !o.cleartext_metadata);
break;
default:
throw std::logic_error("bad encryption R value");