From 6bdac26369c0d770759c2b6ce24afef608a91ec9 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 27 Sep 2009 20:33:17 +0000 Subject: [PATCH] finished testing C API git-svn-id: svn+q:///qpdf/trunk@734 71b93d88-0707-0410-a8cf-f5a4172ac649 --- README.maintainer | 2 ++ configure.ac | 2 +- libqpdf/qpdf-c.cc | 8 ++--- manual/qpdf-manual.xml | 4 +-- qpdf.spec | 2 +- qpdf/qpdf-ctest.c | 43 +++++++++++++++++++++++ qpdf/qpdf.cc | 2 +- qpdf/qtest/qpdf.test | 25 +++++++++++++ qpdf/qtest/qpdf/c-decrypt-with-owner.pdf | Bin 0 -> 9668 bytes qpdf/qtest/qpdf/c-decrypt-with-user.pdf | Bin 0 -> 9668 bytes qpdf/qtest/qpdf/c-r2.pdf | Bin 0 -> 9893 bytes qpdf/qtest/qpdf/c-r3.pdf | Bin 0 -> 9897 bytes 12 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 qpdf/qtest/qpdf/c-decrypt-with-owner.pdf create mode 100644 qpdf/qtest/qpdf/c-decrypt-with-user.pdf create mode 100644 qpdf/qtest/qpdf/c-r2.pdf create mode 100644 qpdf/qtest/qpdf/c-r3.pdf diff --git a/README.maintainer b/README.maintainer index 2fe189f0..28fb6119 100644 --- a/README.maintainer +++ b/README.maintainer @@ -16,6 +16,8 @@ Release Reminders make_dist verifies this consistency. + * Update release date in manual/qpdf-manual.xml + * Each year, update copyright notices. Just search for Copyright. Last updated: 2009. diff --git a/configure.ac b/configure.ac index e66af81f..21fd01c6 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. dnl This config.in requires autoconf 2.5 or greater. AC_PREREQ(2.60) -AC_INIT(qpdf,2.0.6) +AC_INIT(qpdf,2.1.a1) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_FILES([autoconf.mk]) diff --git a/libqpdf/qpdf-c.cc b/libqpdf/qpdf-c.cc index 5f894895..9e2d0cbf 100644 --- a/libqpdf/qpdf-c.cc +++ b/libqpdf/qpdf-c.cc @@ -376,10 +376,10 @@ void qpdf_set_r3_encryption_parameters( ((print == QPDF_R3_PRINT_LOW) ? QPDFWriter::r3p_low : (print == QPDF_R3_PRINT_NONE) ? QPDFWriter::r3p_none : QPDFWriter::r3p_full), - ((print == QPDF_R3_MODIFY_ANNOTATE) ? QPDFWriter::r3m_annotate : - (print == QPDF_R3_MODIFY_FORM) ? QPDFWriter::r3m_form : - (print == QPDF_R3_MODIFY_ASSEMBLY) ? QPDFWriter::r3m_assembly : - (print == QPDF_R3_MODIFY_NONE) ? QPDFWriter::r3m_none : + ((modify == QPDF_R3_MODIFY_ANNOTATE) ? QPDFWriter::r3m_annotate : + (modify == QPDF_R3_MODIFY_FORM) ? QPDFWriter::r3m_form : + (modify == QPDF_R3_MODIFY_ASSEMBLY) ? QPDFWriter::r3m_assembly : + (modify == QPDF_R3_MODIFY_NONE) ? QPDFWriter::r3m_none : QPDFWriter::r3m_all)); } diff --git a/manual/qpdf-manual.xml b/manual/qpdf-manual.xml index eb3c54b9..d5f43cac 100644 --- a/manual/qpdf-manual.xml +++ b/manual/qpdf-manual.xml @@ -5,8 +5,8 @@ - - + + ]> diff --git a/qpdf.spec b/qpdf.spec index f7fd855a..433d3bd1 100644 --- a/qpdf.spec +++ b/qpdf.spec @@ -1,6 +1,6 @@ Summary: Command-line tools and library for transforming PDF files Name: qpdf -Version: 2.0.6 +Version: 2.1.a1 Release: 1%{?dist} License: Artistic Group: System Environment/Libraries diff --git a/qpdf/qpdf-ctest.c b/qpdf/qpdf-ctest.c index 456f06c6..42d8f9f4 100644 --- a/qpdf/qpdf-ctest.c +++ b/qpdf/qpdf-ctest.c @@ -159,6 +159,46 @@ static void test10(char const* infile, report_errors(); } +static void test11(char const* infile, + char const* password, + char const* outfile) +{ + qpdf_read(qpdf, infile, password); + qpdf_init_write(qpdf, outfile); + qpdf_set_static_ID(qpdf, QPDF_TRUE); + qpdf_set_r2_encryption_parameters( + qpdf, "user1", "owner1", QPDF_FALSE, QPDF_TRUE, QPDF_TRUE, QPDF_TRUE); + qpdf_write(qpdf); + report_errors(); +} + +static void test12(char const* infile, + char const* password, + char const* outfile) +{ + qpdf_read(qpdf, infile, password); + qpdf_init_write(qpdf, outfile); + qpdf_set_static_ID(qpdf, QPDF_TRUE); + qpdf_set_r3_encryption_parameters( + qpdf, "user2", "owner2", QPDF_TRUE, QPDF_TRUE, + QPDF_R3_PRINT_LOW, QPDF_R3_MODIFY_ALL); + qpdf_write(qpdf); + report_errors(); +} + +static void test13(char const* infile, + char const* password, + char const* outfile) +{ + qpdf_read(qpdf, infile, password); + printf("user password: %s\n", qpdf_get_user_password(qpdf)); + qpdf_init_write(qpdf, outfile); + qpdf_set_static_ID(qpdf, QPDF_TRUE); + qpdf_set_preserve_encryption(qpdf, QPDF_FALSE); + qpdf_write(qpdf); + report_errors(); +} + int main(int argc, char* argv[]) { char* whoami = 0; @@ -202,6 +242,9 @@ int main(int argc, char* argv[]) (n == 8) ? test08 : (n == 9) ? test09 : (n == 10) ? test10 : + (n == 11) ? test11 : + (n == 12) ? test12 : + (n == 13) ? test13 : 0); if (fn == 0) diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index 9cd0df7b..cc65328f 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -472,7 +472,7 @@ int main(int argc, char* argv[]) // 1 2 3 4 5 6 7 8 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 std::cout - << whoami << " version 2.0.6" << std::endl + << whoami << " version 2.1.a1" << std::endl << "Copyright (c) 2005-2009 Jay Berkenbilt" << std::endl << "This software may be distributed under the terms of version 2 of the" diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index 70021676..8cf355b0 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -851,6 +851,31 @@ $td->runtest("invalid password", $td->EXIT_STATUS => 2}, $td->NORMALIZE_NEWLINES); +my @cenc = ( + [11, 'hybrid-xref.pdf', "''", 'r2', ""], + [12, 'hybrid-xref.pdf', "''", 'r3', ""], + [13, 'c-r2.pdf', 'user1', 'decrypt with user', + "user password: user1\n"], + [13, 'c-r3.pdf', 'owner2', 'decrypt with owner', + "user password: user2\n"], + ); +$n_tests += 2 * @cenc; + +foreach my $d (@cenc) +{ + my ($n, $infile, $pass, $description, $output) = @$d; + my $outfile = $description; + $outfile =~ s/ /-/g; + my $outfile = "c-$outfile.pdf"; + $td->runtest("C API encryption: $description", + {$td->COMMAND => "qpdf-ctest $n $infile $pass a.pdf"}, + {$td->STRING => $output, $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + $td->runtest("check $description", + {$td->FILE => "a.pdf"}, + {$td->FILE => $outfile}); +} + # Test combinations of linearization and encryption. Note that we do # content checks on encrypted and linearized files in various # combinations below. Here we are just making sure that they are diff --git a/qpdf/qtest/qpdf/c-decrypt-with-owner.pdf b/qpdf/qtest/qpdf/c-decrypt-with-owner.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9a0f23b4ff35384cebe384cfbca24ce01da2efd4 GIT binary patch literal 9668 zcmc&)dr(tX8fWc-^tP5q#X;2eK!a6FP3|KJ5d{RyfDZx*Em}kg$(4o;i6$4sXi-YF zK3Z06-M*~bb-UITtr%#nOFOKt-BQ-AS}o4*IH*+GOx4!Gw!Yimdrsiq_GH>*2Il_3 zTyk^H`Tfp!zVDaseDft2cqMj%z!9AV{DB&hkoP`gEW)RC9KlgLMO%e`y5D z0&@jB*Idrp-GEe!ujVE>Llxr(UW z_WIUR=SkJ*b>G~G`_k1OuluOx(tEq7B<{Rh!R#gz)7v&>mKL6P$Mk8^^%J*8=5JG` zUG^4EemC~k^%;h)g6gkE_H!LyZ@4ru~OIbc$v9|BN z+`ny1d*jsO6QcKd$k(&_J?&>N%_k2&5!ct)3eIHqPyO;*TV2PUtLMOqj4oK_IDau5A>al zjhwn>#>-7rKyR$1vjK>RUz zZ|T9!PkBl0ns2RY?W|wqQLdl3$h|F_iyx8poVIL_Z$WN^ z>dnTOS~r(Vm;R$Kc13eyW$zd7P0q2zgeOfM)wOWPZT*=sXGUu;est&k3+ks&=N7Ks z6yDKZm+yW1=xe%9{>ogu>iL(hsQbwNKecWBxBdMw^>?3o{D}2?vK2MpkXxy}aCZy?BZMiFR*}YxGlUI%};MP35VS8$J)^jnQKRvi+|}grQ95=f4N1`AHVUytW$A^e(b;CS-qGVne`p{Y^!_w zx#oR0Z-(U^daC;WwMTPeG>ykUi~puq^~|)ba~^!?c3DDH_dQkHCVU>>|Hy}#jm*w& zL+8uMvofZE3mHov_@KG&`;2cN9XE$}UcayT-59$0K+I%2s~sGmdB2@wv${bEpimG{ zC}1cp3<)X~J#_FvqL=(6AtBz9v zbzCE>j>9AZJ3Ec6Iu0`$oRh3N4$~`~ldL)pb3L4stU3-8Pn?siI!*`FagD4x4%2Sj zPO|DayaV8zWYuvxppI*0)p0tYj%#Jrad<1k&Q2?9V=&Pi4shxb*SldL)pFV8q9 zS#=!VNpcn$F;KRIIMBtc9K=cVFhJ?Q^0blzh26hHKdhLH*wxraC|vkq@oHV z^X~Hg_xUxQnTd+<&hE%gWnRk1#j4MWB0uhRjXFOftVd5wz$#m?-ZB83Wp=Z$7^BQ( z?KLcCvzUQ$mV>Xy+8h-?S!{F6bhvHei+pnxU-i|KKxwKj=U@p~sL=4AQK1H|B^HBW zAxFR};fp&tdVUmJ%Yo8?S~0BH3{d%18;~K|fDw)0vl9835!BKu#Lyz28Z^HzlbDSo zOKS~7i`*?D8wuWfeo@j?ODhUPi~OmGoJZirRJF8jFr>(B$3^7TL?OOssTvI}vgDlC z6Gj|aP~lQU&!H-dxaFQCVl2L8X&N}Bz~U+Qj3wf6U}>&5q`;!7 zdmbSYFko1!2wh`=opuQn3^2M$`hLIsw@aV3$60}q>YG2)heS|Sfe4qCcGP6$N5 z_LUIxaO9x1D`aHRv3*s90Y?s6yh276J=<496ky2kf*zE5g^El`&Ut2lBnV!^hX+~o zZQtwwsR+Dm4-c{^*}jDVJWM-G0yeVCHsu-XvV-fE{w~bN2FP`_K?_*O$1KUR9RXZh z8?=Ijj4TPN<$+v#*d&aS1l5`V87I8y4vT|%B|)_zK*p&ZHVN}ef@%w4!i7XCVdx?_ z-^eZ*Z23urZ9M@xeo*HR-zrdr`U0|@_UbAJ-(Dc}0`RQ`7S8Dcd{2SU2~f=U7?6PC z|M>0#qtnUv7VsH1-@#|A9DZ?^V$0h9Owuz~TNV_37#8+;ib5^iet+I<;^xdQ TuGYmaA$Y!8A~|`MK~MYycWTlT literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/c-decrypt-with-user.pdf b/qpdf/qtest/qpdf/c-decrypt-with-user.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9a0f23b4ff35384cebe384cfbca24ce01da2efd4 GIT binary patch literal 9668 zcmc&)dr(tX8fWc-^tP5q#X;2eK!a6FP3|KJ5d{RyfDZx*Em}kg$(4o;i6$4sXi-YF zK3Z06-M*~bb-UITtr%#nOFOKt-BQ-AS}o4*IH*+GOx4!Gw!Yimdrsiq_GH>*2Il_3 zTyk^H`Tfp!zVDaseDft2cqMj%z!9AV{DB&hkoP`gEW)RC9KlgLMO%e`y5D z0&@jB*Idrp-GEe!ujVE>Llxr(UW z_WIUR=SkJ*b>G~G`_k1OuluOx(tEq7B<{Rh!R#gz)7v&>mKL6P$Mk8^^%J*8=5JG` zUG^4EemC~k^%;h)g6gkE_H!LyZ@4ru~OIbc$v9|BN z+`ny1d*jsO6QcKd$k(&_J?&>N%_k2&5!ct)3eIHqPyO;*TV2PUtLMOqj4oK_IDau5A>al zjhwn>#>-7rKyR$1vjK>RUz zZ|T9!PkBl0ns2RY?W|wqQLdl3$h|F_iyx8poVIL_Z$WN^ z>dnTOS~r(Vm;R$Kc13eyW$zd7P0q2zgeOfM)wOWPZT*=sXGUu;est&k3+ks&=N7Ks z6yDKZm+yW1=xe%9{>ogu>iL(hsQbwNKecWBxBdMw^>?3o{D}2?vK2MpkXxy}aCZy?BZMiFR*}YxGlUI%};MP35VS8$J)^jnQKRvi+|}grQ95=f4N1`AHVUytW$A^e(b;CS-qGVne`p{Y^!_w zx#oR0Z-(U^daC;WwMTPeG>ykUi~puq^~|)ba~^!?c3DDH_dQkHCVU>>|Hy}#jm*w& zL+8uMvofZE3mHov_@KG&`;2cN9XE$}UcayT-59$0K+I%2s~sGmdB2@wv${bEpimG{ zC}1cp3<)X~J#_FvqL=(6AtBz9v zbzCE>j>9AZJ3Ec6Iu0`$oRh3N4$~`~ldL)pb3L4stU3-8Pn?siI!*`FagD4x4%2Sj zPO|DayaV8zWYuvxppI*0)p0tYj%#Jrad<1k&Q2?9V=&Pi4shxb*SldL)pFV8q9 zS#=!VNpcn$F;KRIIMBtc9K=cVFhJ?Q^0blzh26hHKdhLH*wxraC|vkq@oHV z^X~Hg_xUxQnTd+<&hE%gWnRk1#j4MWB0uhRjXFOftVd5wz$#m?-ZB83Wp=Z$7^BQ( z?KLcCvzUQ$mV>Xy+8h-?S!{F6bhvHei+pnxU-i|KKxwKj=U@p~sL=4AQK1H|B^HBW zAxFR};fp&tdVUmJ%Yo8?S~0BH3{d%18;~K|fDw)0vl9835!BKu#Lyz28Z^HzlbDSo zOKS~7i`*?D8wuWfeo@j?ODhUPi~OmGoJZirRJF8jFr>(B$3^7TL?OOssTvI}vgDlC z6Gj|aP~lQU&!H-dxaFQCVl2L8X&N}Bz~U+Qj3wf6U}>&5q`;!7 zdmbSYFko1!2wh`=opuQn3^2M$`hLIsw@aV3$60}q>YG2)heS|Sfe4qCcGP6$N5 z_LUIxaO9x1D`aHRv3*s90Y?s6yh276J=<496ky2kf*zE5g^El`&Ut2lBnV!^hX+~o zZQtwwsR+Dm4-c{^*}jDVJWM-G0yeVCHsu-XvV-fE{w~bN2FP`_K?_*O$1KUR9RXZh z8?=Ijj4TPN<$+v#*d&aS1l5`V87I8y4vT|%B|)_zK*p&ZHVN}ef@%w4!i7XCVdx?_ z-^eZ*Z23urZ9M@xeo*HR-zrdr`U0|@_UbAJ-(Dc}0`RQ`7S8Dcd{2SU2~f=U7?6PC z|M>0#qtnUv7VsH1-@#|A9DZ?^V$0h9Owuz~TNV_37#8+;ib5^iet+I<;^xdQ TuGYmaA$Y!8A~|`MK~MYycWTlT literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/c-r2.pdf b/qpdf/qtest/qpdf/c-r2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0301696cfa65e5d80d25704419ce69d1c121431e GIT binary patch literal 9893 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