diff options
Diffstat (limited to 'Build/source/texk/dvipdfmx/dvipdfmx-20110309')
10 files changed, 132 insertions, 43 deletions
diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/ChangeLog b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/ChangeLog index 486c491605b..9a3b04b7040 100644 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/ChangeLog +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/ChangeLog @@ -1,8 +1,22 @@ -$Header: /home/cvsroot/dvipdfmx/ChangeLog,v 1.286 2011/03/05 02:07:33 chofchof Exp $ +$Header: /home/cvsroot/dvipdfmx/ChangeLog,v 1.289 2011/03/09 07:58:12 chofchof Exp $ ChangeLog: Changes for DVIPDFMx =============================== +2011-03-09 Jin-Hwan Cho + + * dpxfile.c, configure.in, man/extractbb.1: + Applied the patches for TeX Live 2011 by Peter Breitenlohner. + +2011-03-07 Matthias Franz + + * dvi.c, dvi.h, dvipdfmx.c, pdfencrypt.c, pdfencrypt.h, spc_pdfm.c: + Added special pdf:encrypt to turn on document encryption from + within the DVI file (suggested by Michael Joyner). Format: + \special{pdf:encrypt ownerpw (abc) userpw (xyz) length 128 perm 252} + If a parameter is omitted, the default value / empty password + is used. The special must appear at the beginning of the file. + 2011-03-05 Jin-Hwan Cho * dpxfile.c: Applied the secutiry patch written by Akira Kakuto diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/configure b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/configure index 3b0dd842b07..876e3c4f791 100755 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/configure +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/configure @@ -2321,7 +2321,7 @@ fi # Define the identity of the package. PACKAGE=dvipdfmx - VERSION=20110305 + VERSION=20110309 cat >>confdefs.h <<_ACEOF diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/configure.in b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/configure.in index 0ca6c72108e..b76ef10cf32 100644 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/configure.in +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(src/dvipdfmx.c) -AM_INIT_AUTOMAKE(dvipdfmx, 20110305) +AM_INIT_AUTOMAKE(dvipdfmx, 20110309) AM_CONFIG_HEADER(config.h) AM_MAINTAINER_MODE diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dpxfile.c b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dpxfile.c index 67155401510..b8267374bb4 100644 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dpxfile.c +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dpxfile.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/dpxfile.c,v 1.28 2011/03/06 03:06:59 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/dpxfile.c,v 1.29 2011/03/09 07:55:19 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvi.c b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvi.c index 0270af88473..d497e38bda1 100644 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvi.c +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvi.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/dvi.c,v 1.42 2011/03/06 03:14:14 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/dvi.c,v 1.44 2011/03/08 20:25:52 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -40,6 +40,7 @@ #include "pdfdev.h" #include "pdfdoc.h" #include "pdfparse.h" +#include "pdfencrypt.h" #include "fontmap.h" @@ -1688,7 +1689,10 @@ read_length (double *vp, double mag, const char **pp, const char *endptr) static int -scan_special (double *wd, double *ht, double *xo, double *yo, char *lm, unsigned *minorversion, const char *buf, UNSIGNED_QUAD size) +scan_special (double *wd, double *ht, double *xo, double *yo, char *lm, + unsigned *minorversion, + int *do_enc, unsigned *key_bits, unsigned *permission, char *owner_pw, char *user_pw, + const char *buf, UNSIGNED_QUAD size) { char *q; const char *p = buf, *endptr; @@ -1771,6 +1775,48 @@ scan_special (double *wd, double *ht, double *xo, double *yo, char *lm, unsigned *minorversion = (unsigned)strtol(kv, NULL, 10); RELEASE(kv); } + } else if (ns_pdf && !strcmp(q, "encrypt") && do_enc) { + *do_enc = 1; + *owner_pw = *user_pw = 0; + while (!error && p < endptr) { + char *kp = parse_c_ident(&p, endptr); + if (!kp) + break; + else { + pdf_obj *obj; + skip_white(&p, endptr); + if (!strcmp(kp, "ownerpw")) { + if ((obj = parse_pdf_string(&p, endptr))) { + strncpy(owner_pw, pdf_string_value(obj), MAX_PWD_LEN); + pdf_release_obj(obj); + } else + error = -1; + } else if (!strcmp(kp, "userpw")) { + if ((obj = parse_pdf_string(&p, endptr))) { + strncpy(user_pw, pdf_string_value(obj), MAX_PWD_LEN); + pdf_release_obj(obj); + } else + error = -1; + } else if (!strcmp(kp, "length")) { + if ((obj = parse_pdf_number(&p, endptr)) && PDF_OBJ_NUMBERTYPE(obj)) { + *key_bits = (unsigned) pdf_number_value(obj); + } else + error = -1; + if (obj) + pdf_release_obj(obj); + } else if (!strcmp(kp, "perm")) { + if ((obj = parse_pdf_number(&p, endptr)) && PDF_OBJ_NUMBERTYPE(obj)) { + *permission = (unsigned) pdf_number_value(obj); + } else + error = -1; + if (obj) + pdf_release_obj(obj); + } else + error = -1; + RELEASE(kp); + } + skip_white(&p, endptr); + } } RELEASE(q); } @@ -1783,7 +1829,8 @@ void dvi_scan_specials (unsigned page_no, double *page_width, double *page_height, double *x_offset, double *y_offset, char *landscape, - unsigned *minorversion) + unsigned *minorversion, + int *do_enc, unsigned *key_bits, unsigned *permission, char *owner_pw, char *user_pw) { FILE *fp = dvi_file; long offset; @@ -1812,7 +1859,9 @@ dvi_scan_specials (unsigned page_no, size = MIN(size, 1024); if (fread(buf, sizeof(char), size, fp) != size) ERROR("Reading DVI file failed!"); - scan_special(page_width, page_height, x_offset, y_offset, landscape, minorversion, buf, size); + if (scan_special(page_width, page_height, x_offset, y_offset, landscape, + minorversion, do_enc, key_bits, permission, owner_pw, user_pw, buf, size)) + WARN("Reading special command failed: \"%.*s\"", size, buf); continue; } diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvi.h b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvi.h index 35873e9bd1c..e18e8b02388 100644 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvi.h +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvi.h @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/dvi.h,v 1.15 2010/03/28 06:03:57 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/dvi.h,v 1.16 2011/03/08 00:20:51 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -73,7 +73,8 @@ extern void dvi_do_page (unsigned page_no, extern void dvi_scan_specials (unsigned page_no, double *width, double *height, double *x_offset, double *y_offset, - char *landscape, unsigned *minorversion); + char *landscape, unsigned *minorversion, + int *do_enc, unsigned *key_bits, unsigned *permission, char *owner_pw, char *user_pw); extern int dvi_locate_font (const char *name, spt_t ptsize); /* link or nolink: diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvipdfmx.c b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvipdfmx.c index 2e91b57e426..e576eea500d 100644 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvipdfmx.c +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/dvipdfmx.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/dvipdfmx.c,v 1.84 2011/03/06 03:31:47 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/dvipdfmx.c,v 1.85 2011/03/08 00:20:51 matthias Exp $ This is DVIPDFMx, an eXtended version of DVIPDFM by Mark A. Wicks. @@ -171,7 +171,7 @@ show_usage (void) fprintf(stdout, "\t\tAnd negative values replace old values.\n"); fprintf(stdout, "-D template\tPS->PDF conversion command line template [none]\n"); fprintf(stdout, "-E \t\tEnable DVIPDFM emulation mode\n"); - fprintf(stdout, "-K number\tEncryption key bits [40]\n"); + fprintf(stdout, "-K number\tEncryption key length [40]\n"); fprintf(stdout, "-O number\tSet maximum depth of open bookmark items [0]\n"); fprintf(stdout, "-P number\tSet permission flags for PDF encryption [0x003C]\n"); fprintf(stdout, "-S \t\tEnable PDF encryption\n"); @@ -522,10 +522,10 @@ do_args (int argc, char *argv[]) do_encryption = 1; break; case 'K': - CHECK_ARG(1, "encryption key bits"); + CHECK_ARG(1, "encryption key length"); key_bits = (unsigned) atoi(argv[1]); - if (key_bits < 40 || key_bits > 128) - ERROR("Invalid encryption key bits specified: %s", argv[1]); + if (key_bits < 40 || key_bits > 128 || (key_bits & 0x7)) + ERROR("Invalid encryption key length specified: %s", argv[1]); POP_ARG(); break; case 'P': @@ -730,7 +730,7 @@ do_dvi_pages (void) /* Users want to change page size even after page is started! */ w = page_width; h = page_height; lm = landscape_mode; xo = x_offset; yo = y_offset; - dvi_scan_specials(page_no, &w, &h, &xo, &yo, &lm, NULL); + dvi_scan_specials(page_no, &w, &h, &xo, &yo, &lm, NULL, NULL, NULL, NULL, NULL, NULL); if (lm != landscape_mode) { SWAP(w, h); landscape_mode = lm; @@ -902,7 +902,7 @@ main (int argc, char *argv[]) if (key_bits > 40 && pdf_get_version() < 4) ERROR("Chosen key length requires at least PDF 1.4. " "Use \"-V 4\" to change."); - pdf_enc_set_passwd(key_bits, permission, dvi_filename, pdf_filename); + pdf_enc_set_passwd(key_bits, permission, NULL, NULL); } if (mp_mode) { @@ -911,6 +911,7 @@ main (int argc, char *argv[]) dvi2pts = 0.01; /* dvi2pts controls accuracy. */ } else { unsigned ver_minor = 0; + char owner_pw[MAX_PWD_LEN], user_pw[MAX_PWD_LEN]; /* Dependency between DVI and PDF side is rather complicated... */ dvi2pts = dvi_init(dvi_filename, mag); if (dvi2pts == 0.0) @@ -918,7 +919,23 @@ main (int argc, char *argv[]) pdf_doc_set_creator(dvi_comment()); - dvi_scan_specials(0, &paper_width, &paper_height, &x_offset, &y_offset, &landscape_mode, &ver_minor); + if (do_encryption) + /* command line takes precedence */ + dvi_scan_specials(0, &paper_width, &paper_height, &x_offset, &y_offset, &landscape_mode, + &ver_minor, NULL, NULL, NULL, NULL, NULL); + else { + dvi_scan_specials(0, &paper_width, &paper_height, &x_offset, &y_offset, &landscape_mode, + &ver_minor, &do_encryption, &key_bits, &permission, owner_pw, user_pw); + if (do_encryption) { + if (key_bits < 40 || key_bits > 128 || (key_bits & 0x7)) + ERROR("Invalid encryption key length specified: %u", key_bits); + else if (key_bits > 40 && pdf_get_version() < 4) + ERROR("Chosen key length requires at least PDF 1.4. " + "Use \"-V 4\" to change."); + do_encryption = 1; + pdf_enc_set_passwd(key_bits, permission, owner_pw, user_pw); + } + } if (ver_minor >= PDF_VERSION_MIN && ver_minor <= PDF_VERSION_MAX) { pdf_set_version(ver_minor); } diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/pdfencrypt.c b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/pdfencrypt.c index 867396504ae..534711ba41a 100644 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/pdfencrypt.c +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/pdfencrypt.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfencrypt.c,v 1.15 2011/03/06 03:14:14 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfencrypt.c,v 1.16 2011/03/08 00:20:51 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -46,7 +46,6 @@ #define MAX_KEY_LEN 16 #define MAX_STR_LEN 32 -#define MAX_PWD_LEN 128 static unsigned char algorithm, revision, key_size; static long permission; @@ -365,27 +364,33 @@ static char *getpass (const char *prompt) } #endif -void pdf_enc_set_passwd (unsigned bits, unsigned perm, char *dviname, char *pdfname) +void pdf_enc_set_passwd (unsigned bits, unsigned perm, const char *owner_pw, const char *user_pw) { - register char *retry_passwd; - - while (1) { - strcpy(owner_passwd, getpass("Owner password: ")); - retry_passwd = getpass("Re-enter owner password: "); - if (!strcmp(owner_passwd, retry_passwd)) - break; - fputs("Password is not identical.\nTry again.\n", stderr); - fflush(stderr); - } - - while (1) { - strcpy(user_passwd, getpass("User password: ")); - retry_passwd = getpass("Re-enter user password: "); - if (!strcmp(user_passwd, retry_passwd)) - break; - fputs("Password is not identical.\nTry again.\n", stderr); - fflush(stderr); - } + char *retry_passwd; + + if (owner_pw) { + strncpy(owner_passwd, owner_pw, MAX_PWD_LEN); + } else + while (1) { + strncpy(owner_passwd, getpass("Owner password: "), MAX_PWD_LEN); + retry_passwd = getpass("Re-enter owner password: "); + if (!strncmp(owner_passwd, retry_passwd, MAX_PWD_LEN)) + break; + fputs("Password is not identical.\nTry again.\n", stderr); + fflush(stderr); + } + + if (user_pw) { + strncpy(user_passwd, user_pw, MAX_PWD_LEN); + } else + while (1) { + strncpy(user_passwd, getpass("User password: "), MAX_PWD_LEN); + retry_passwd = getpass("Re-enter user password: "); + if (!strncmp(user_passwd, retry_passwd, MAX_PWD_LEN)) + break; + fputs("Password is not identical.\nTry again.\n", stderr); + fflush(stderr); + } key_size = (unsigned char)(bits / 8); algorithm = (key_size == 5 ? 1 : 2); diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/pdfencrypt.h b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/pdfencrypt.h index 7abdc433dad..7e3ae60a3a4 100644 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/pdfencrypt.h +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/pdfencrypt.h @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfencrypt.h,v 1.4 2010/02/07 12:53:44 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfencrypt.h,v 1.5 2011/03/08 00:20:51 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -25,12 +25,14 @@ #include "pdfobj.h" +#define MAX_PWD_LEN 128 + extern void pdf_enc_set_verbose (void); extern pdf_obj *pdf_enc_id_array (void); extern void pdf_enc_compute_id_string (char *dviname, char *pdfname); extern void pdf_enc_set_label (unsigned long label); extern void pdf_enc_set_generation (unsigned generation); -extern void pdf_enc_set_passwd (unsigned size, unsigned perm, char *dviname, char *pdfname); +extern void pdf_enc_set_passwd (unsigned size, unsigned perm, const char *owner, const char *user); extern void pdf_encrypt_data (unsigned char *data, unsigned long len); extern pdf_obj *pdf_encrypt_obj (void); diff --git a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/spc_pdfm.c b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/spc_pdfm.c index 9501506755f..fac8ca255a9 100644 --- a/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/spc_pdfm.c +++ b/Build/source/texk/dvipdfmx/dvipdfmx-20110309/src/spc_pdfm.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/spc_pdfm.c,v 1.53 2011/03/06 03:14:15 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/spc_pdfm.c,v 1.54 2011/03/08 00:20:51 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -1953,6 +1953,7 @@ static struct spc_handler pdfm_handlers[] = { {"code", spc_handler_pdfm_code}, {"minorversion", spc_handler_pdfm_do_nothing}, + {"encrypt", spc_handler_pdfm_do_nothing}, }; int |