* bug#33684: DocView bombs out upon password protected PDFs
@ 2018-12-09 10:52 積丹尼 Dan Jacobson
2019-01-27 2:14 ` Federico Tedin
0 siblings, 1 reply; 14+ messages in thread
From: 積丹尼 Dan Jacobson @ 2018-12-09 10:52 UTC (permalink / raw)
To: 33684
When trying to view a password protected PDF:
DocView: process pdf/ps->png changed status to exited abnormally with code 1.
Maybe it should ask for the password.
emacs-version "25.2.2"
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2018-12-09 10:52 bug#33684: DocView bombs out upon password protected PDFs 積丹尼 Dan Jacobson
@ 2019-01-27 2:14 ` Federico Tedin
2019-02-01 9:33 ` Eli Zaretskii
0 siblings, 1 reply; 14+ messages in thread
From: Federico Tedin @ 2019-01-27 2:14 UTC (permalink / raw)
To: 積丹尼 Dan Jacobson, 33684
[-- Attachment #1: Type: text/plain, Size: 612 bytes --]
積丹尼 Dan Jacobson <jidanni@jidanni.org> writes:
> When trying to view a password protected PDF:
> DocView: process pdf/ps->png changed status to exited abnormally with code 1.
> Maybe it should ask for the password.
> emacs-version "25.2.2"
Would something like this make sense? A short patch that adds
`doc-view-pdf-password-protected-p', and an extra option to pass to
Ghostscript (-sPDFPassword=) when the command is invoked (only when the
PDF file is password protected). I tried it out by creating a
password-protected PDF using LibreOffice Writer, and then opening it
with find-file.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 2490 bytes --]
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index df8a9fc70f..8691d2a3a6 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -183,11 +183,16 @@ doc-view-pdf->png-converter-function
(defcustom doc-view-ghostscript-options
'("-dSAFER" ;; Avoid security problems when rendering files from untrusted
;; sources.
- "-dNOPAUSE" "-sDEVICE=png16m" "-dTextAlphaBits=4"
- "-dBATCH" "-dGraphicsAlphaBits=4" "-dQUIET")
+ "-dNOPAUSE" "-dTextAlphaBits=4" "-dBATCH"
+ "-dGraphicsAlphaBits=4" "-dQUIET")
"A list of options to give to ghostscript."
:type '(repeat string))
+(defcustom doc-view-ghostscript-device "png16m"
+ "Output device to give to ghostscript."
+ :type 'string
+ :version "27.1")
+
(defcustom doc-view-resolution 100
"Dots per inch resolution used to render the documents.
Higher values result in larger images."
@@ -950,16 +955,30 @@ doc-view-dvi->pdf
(list "-o" pdf dvi)
callback)))
+(defun doc-view-pdf-password-protected-p (pdf)
+ "Using Ghostscript, check if a PDF file is password-protected."
+ (with-temp-buffer
+ (apply #'call-process doc-view-ghostscript-program nil (current-buffer)
+ nil `(,@doc-view-ghostscript-options
+ "-sNODISPLAY"
+ ,pdf))
+ (goto-char (point-min))
+ (search-forward "This file requires a password for access." nil t)))
+
(defun doc-view-pdf->png-converter-ghostscript (pdf png page callback)
- (doc-view-start-process
- "pdf/ps->png" doc-view-ghostscript-program
- `(,@doc-view-ghostscript-options
- ,(format "-r%d" (round doc-view-resolution))
- ,@(if page `(,(format "-dFirstPage=%d" page)))
- ,@(if page `(,(format "-dLastPage=%d" page)))
- ,(concat "-sOutputFile=" png)
- ,pdf)
- callback))
+ (let ((pdf-passwd (if (doc-view-pdf-password-protected-p pdf)
+ (read-passwd "Enter password for PDF file: "))))
+ (doc-view-start-process
+ "pdf/ps->png" doc-view-ghostscript-program
+ `(,@doc-view-ghostscript-options
+ ,(concat "-sDEVICE=" doc-view-ghostscript-device)
+ ,(format "-r%d" (round doc-view-resolution))
+ ,@(if page `(,(format "-dFirstPage=%d" page)))
+ ,@(if page `(,(format "-dLastPage=%d" page)))
+ ,@(if pdf-passwd `(,(format "-sPDFPassword=%s" pdf-passwd)))
+ ,(concat "-sOutputFile=" png)
+ ,pdf)
+ callback)))
(defalias 'doc-view-ps->png-converter-ghostscript
'doc-view-pdf->png-converter-ghostscript)
^ permalink raw reply related [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-01-27 2:14 ` Federico Tedin
@ 2019-02-01 9:33 ` Eli Zaretskii
2019-02-01 10:12 ` Tassilo Horn
0 siblings, 1 reply; 14+ messages in thread
From: Eli Zaretskii @ 2019-02-01 9:33 UTC (permalink / raw)
To: Federico Tedin, Tassilo Horn; +Cc: 33684, jidanni
> From: Federico Tedin <federicotedin@gmail.com>
> Date: Sat, 26 Jan 2019 23:14:49 -0300
Thanks.
Tassilo, any comments on the proposal below? Should I push it?
> 積丹尼 Dan Jacobson <jidanni@jidanni.org> writes:
>
> > When trying to view a password protected PDF:
> > DocView: process pdf/ps->png changed status to exited abnormally with code 1.
> > Maybe it should ask for the password.
> > emacs-version "25.2.2"
>
> Would something like this make sense? A short patch that adds
> `doc-view-pdf-password-protected-p', and an extra option to pass to
> Ghostscript (-sPDFPassword=) when the command is invoked (only when the
> PDF file is password protected). I tried it out by creating a
> password-protected PDF using LibreOffice Writer, and then opening it
> with find-file.
>
>
> diff --git a/lisp/doc-view.el b/lisp/doc-view.el
> index df8a9fc70f..8691d2a3a6 100644
> --- a/lisp/doc-view.el
> +++ b/lisp/doc-view.el
> @@ -183,11 +183,16 @@ doc-view-pdf->png-converter-function
> (defcustom doc-view-ghostscript-options
> '("-dSAFER" ;; Avoid security problems when rendering files from untrusted
> ;; sources.
> - "-dNOPAUSE" "-sDEVICE=png16m" "-dTextAlphaBits=4"
> - "-dBATCH" "-dGraphicsAlphaBits=4" "-dQUIET")
> + "-dNOPAUSE" "-dTextAlphaBits=4" "-dBATCH"
> + "-dGraphicsAlphaBits=4" "-dQUIET")
> "A list of options to give to ghostscript."
> :type '(repeat string))
>
> +(defcustom doc-view-ghostscript-device "png16m"
> + "Output device to give to ghostscript."
> + :type 'string
> + :version "27.1")
> +
> (defcustom doc-view-resolution 100
> "Dots per inch resolution used to render the documents.
> Higher values result in larger images."
> @@ -950,16 +955,30 @@ doc-view-dvi->pdf
> (list "-o" pdf dvi)
> callback)))
>
> +(defun doc-view-pdf-password-protected-p (pdf)
> + "Using Ghostscript, check if a PDF file is password-protected."
> + (with-temp-buffer
> + (apply #'call-process doc-view-ghostscript-program nil (current-buffer)
> + nil `(,@doc-view-ghostscript-options
> + "-sNODISPLAY"
> + ,pdf))
> + (goto-char (point-min))
> + (search-forward "This file requires a password for access." nil t)))
> +
> (defun doc-view-pdf->png-converter-ghostscript (pdf png page callback)
> - (doc-view-start-process
> - "pdf/ps->png" doc-view-ghostscript-program
> - `(,@doc-view-ghostscript-options
> - ,(format "-r%d" (round doc-view-resolution))
> - ,@(if page `(,(format "-dFirstPage=%d" page)))
> - ,@(if page `(,(format "-dLastPage=%d" page)))
> - ,(concat "-sOutputFile=" png)
> - ,pdf)
> - callback))
> + (let ((pdf-passwd (if (doc-view-pdf-password-protected-p pdf)
> + (read-passwd "Enter password for PDF file: "))))
> + (doc-view-start-process
> + "pdf/ps->png" doc-view-ghostscript-program
> + `(,@doc-view-ghostscript-options
> + ,(concat "-sDEVICE=" doc-view-ghostscript-device)
> + ,(format "-r%d" (round doc-view-resolution))
> + ,@(if page `(,(format "-dFirstPage=%d" page)))
> + ,@(if page `(,(format "-dLastPage=%d" page)))
> + ,@(if pdf-passwd `(,(format "-sPDFPassword=%s" pdf-passwd)))
> + ,(concat "-sOutputFile=" png)
> + ,pdf)
> + callback)))
>
> (defalias 'doc-view-ps->png-converter-ghostscript
> 'doc-view-pdf->png-converter-ghostscript)
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-01 9:33 ` Eli Zaretskii
@ 2019-02-01 10:12 ` Tassilo Horn
2019-02-01 10:34 ` Eli Zaretskii
0 siblings, 1 reply; 14+ messages in thread
From: Tassilo Horn @ 2019-02-01 10:12 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 33684, Federico Tedin, jidanni
Eli Zaretskii <eliz@gnu.org> writes:
Hi Federico, Dan & Eli,
>> From: Federico Tedin <federicotedin@gmail.com>
>> Date: Sat, 26 Jan 2019 23:14:49 -0300
>
> Thanks.
>
> Tassilo, any comments on the proposal below? Should I push it?
It would be great if we could support opening password protected PDFs
also when we're using mupdf as a converter. That has a "-p" option for
the very same sake which could be set analogously in
`doc-view-pdf->png-converter-mupdf'.
So, yes, please push it with that small addition.
Bye,
Tassilo
>> 積丹尼 Dan Jacobson <jidanni@jidanni.org> writes:
>>
>> > When trying to view a password protected PDF:
>> > DocView: process pdf/ps->png changed status to exited abnormally with code 1.
>> > Maybe it should ask for the password.
>> > emacs-version "25.2.2"
>>
>> Would something like this make sense? A short patch that adds
>> `doc-view-pdf-password-protected-p', and an extra option to pass to
>> Ghostscript (-sPDFPassword=) when the command is invoked (only when the
>> PDF file is password protected). I tried it out by creating a
>> password-protected PDF using LibreOffice Writer, and then opening it
>> with find-file.
>>
>>
>> diff --git a/lisp/doc-view.el b/lisp/doc-view.el
>> index df8a9fc70f..8691d2a3a6 100644
>> --- a/lisp/doc-view.el
>> +++ b/lisp/doc-view.el
>> @@ -183,11 +183,16 @@ doc-view-pdf->png-converter-function
>> (defcustom doc-view-ghostscript-options
>> '("-dSAFER" ;; Avoid security problems when rendering files from untrusted
>> ;; sources.
>> - "-dNOPAUSE" "-sDEVICE=png16m" "-dTextAlphaBits=4"
>> - "-dBATCH" "-dGraphicsAlphaBits=4" "-dQUIET")
>> + "-dNOPAUSE" "-dTextAlphaBits=4" "-dBATCH"
>> + "-dGraphicsAlphaBits=4" "-dQUIET")
>> "A list of options to give to ghostscript."
>> :type '(repeat string))
>>
>> +(defcustom doc-view-ghostscript-device "png16m"
>> + "Output device to give to ghostscript."
>> + :type 'string
>> + :version "27.1")
>> +
>> (defcustom doc-view-resolution 100
>> "Dots per inch resolution used to render the documents.
>> Higher values result in larger images."
>> @@ -950,16 +955,30 @@ doc-view-dvi->pdf
>> (list "-o" pdf dvi)
>> callback)))
>>
>> +(defun doc-view-pdf-password-protected-p (pdf)
>> + "Using Ghostscript, check if a PDF file is password-protected."
>> + (with-temp-buffer
>> + (apply #'call-process doc-view-ghostscript-program nil (current-buffer)
>> + nil `(,@doc-view-ghostscript-options
>> + "-sNODISPLAY"
>> + ,pdf))
>> + (goto-char (point-min))
>> + (search-forward "This file requires a password for access." nil t)))
>> +
>> (defun doc-view-pdf->png-converter-ghostscript (pdf png page callback)
>> - (doc-view-start-process
>> - "pdf/ps->png" doc-view-ghostscript-program
>> - `(,@doc-view-ghostscript-options
>> - ,(format "-r%d" (round doc-view-resolution))
>> - ,@(if page `(,(format "-dFirstPage=%d" page)))
>> - ,@(if page `(,(format "-dLastPage=%d" page)))
>> - ,(concat "-sOutputFile=" png)
>> - ,pdf)
>> - callback))
>> + (let ((pdf-passwd (if (doc-view-pdf-password-protected-p pdf)
>> + (read-passwd "Enter password for PDF file: "))))
>> + (doc-view-start-process
>> + "pdf/ps->png" doc-view-ghostscript-program
>> + `(,@doc-view-ghostscript-options
>> + ,(concat "-sDEVICE=" doc-view-ghostscript-device)
>> + ,(format "-r%d" (round doc-view-resolution))
>> + ,@(if page `(,(format "-dFirstPage=%d" page)))
>> + ,@(if page `(,(format "-dLastPage=%d" page)))
>> + ,@(if pdf-passwd `(,(format "-sPDFPassword=%s" pdf-passwd)))
>> + ,(concat "-sOutputFile=" png)
>> + ,pdf)
>> + callback)))
>>
>> (defalias 'doc-view-ps->png-converter-ghostscript
>> 'doc-view-pdf->png-converter-ghostscript)
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-01 10:12 ` Tassilo Horn
@ 2019-02-01 10:34 ` Eli Zaretskii
2019-02-01 10:42 ` Federico Tedin
2019-02-02 20:58 ` Federico Tedin
0 siblings, 2 replies; 14+ messages in thread
From: Eli Zaretskii @ 2019-02-01 10:34 UTC (permalink / raw)
To: Tassilo Horn; +Cc: 33684, federicotedin, jidanni
> From: Tassilo Horn <tsdh@gnu.org>
> Cc: Federico Tedin <federicotedin@gmail.com>, jidanni@jidanni.org, 33684@debbugs.gnu.org
> Date: Fri, 01 Feb 2019 11:12:51 +0100
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> Hi Federico, Dan & Eli,
>
> >> From: Federico Tedin <federicotedin@gmail.com>
> >> Date: Sat, 26 Jan 2019 23:14:49 -0300
> >
> > Thanks.
> >
> > Tassilo, any comments on the proposal below? Should I push it?
>
> It would be great if we could support opening password protected PDFs
> also when we're using mupdf as a converter. That has a "-p" option for
> the very same sake which could be set analogously in
> `doc-view-pdf->png-converter-mupdf'.
>
> So, yes, please push it with that small addition.
Thanks.
Federico, would you please like to propose a patch with the addition
requested by Tassilo?
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-01 10:34 ` Eli Zaretskii
@ 2019-02-01 10:42 ` Federico Tedin
2019-02-02 20:58 ` Federico Tedin
1 sibling, 0 replies; 14+ messages in thread
From: Federico Tedin @ 2019-02-01 10:42 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Tassilo Horn, 33684, jidanni
[-- Attachment #1: Type: text/plain, Size: 28 bytes --]
Sure! I’ll look into it.
[-- Attachment #2: Type: text/html, Size: 50 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-01 10:34 ` Eli Zaretskii
2019-02-01 10:42 ` Federico Tedin
@ 2019-02-02 20:58 ` Federico Tedin
2019-02-03 8:40 ` Tassilo Horn
1 sibling, 1 reply; 14+ messages in thread
From: Federico Tedin @ 2019-02-02 20:58 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Tassilo Horn, 33684, jidanni
[-- Attachment #1: Type: text/plain, Size: 715 bytes --]
Here's the new version of the patch, which enables using MuPDF to open
password-protected PDF files.
One problem I encountered while writing it is that function
`doc-view-pdf->png-converter-mupdf' uses a small hack to add "draw" to
the arguments list passed to `doc-view-start-process', only when
`doc-view-pdfdraw-program' has the value "mutool". This is because the
"mudraw" command has been replaced at some point by the "mutool"
command, which requires passing "draw" as a subcommand to do the same
work. I ended up using the same hack in the new function I created, with
a reference to the original one, but I'm not sure this was the best
possible approach. Is there a cleaner way to solve this?
- Federico
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 4418 bytes --]
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index df8a9fc70f..b690fb1bd6 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -183,11 +183,16 @@ doc-view-pdf->png-converter-function
(defcustom doc-view-ghostscript-options
'("-dSAFER" ;; Avoid security problems when rendering files from untrusted
;; sources.
- "-dNOPAUSE" "-sDEVICE=png16m" "-dTextAlphaBits=4"
+ "-dNOPAUSE" "-dTextAlphaBits=4"
"-dBATCH" "-dGraphicsAlphaBits=4" "-dQUIET")
"A list of options to give to ghostscript."
:type '(repeat string))
+(defcustom doc-view-ghostscript-device "png16m"
+ "Output device to give to ghostscript."
+ :type 'string
+ :version "27.1")
+
(defcustom doc-view-resolution 100
"Dots per inch resolution used to render the documents.
Higher values result in larger images."
@@ -950,16 +955,31 @@ doc-view-dvi->pdf
(list "-o" pdf dvi)
callback)))
+(defun doc-view-pdf-password-protected-ghostscript-p (pdf)
+ "Using Ghostscript, check if a PDF file is password-protected. If it
+is, return non-nil."
+ (with-temp-buffer
+ (apply #'call-process doc-view-ghostscript-program nil (current-buffer)
+ nil `(,@doc-view-ghostscript-options
+ "-sNODISPLAY"
+ ,pdf))
+ (goto-char (point-min))
+ (search-forward "This file requires a password for access." nil t)))
+
(defun doc-view-pdf->png-converter-ghostscript (pdf png page callback)
- (doc-view-start-process
- "pdf/ps->png" doc-view-ghostscript-program
- `(,@doc-view-ghostscript-options
- ,(format "-r%d" (round doc-view-resolution))
- ,@(if page `(,(format "-dFirstPage=%d" page)))
- ,@(if page `(,(format "-dLastPage=%d" page)))
- ,(concat "-sOutputFile=" png)
- ,pdf)
- callback))
+ (let ((pdf-passwd (if (doc-view-pdf-password-protected-ghostscript-p pdf)
+ (read-passwd "Enter password for PDF file: "))))
+ (doc-view-start-process
+ "pdf/ps->png" doc-view-ghostscript-program
+ `(,@doc-view-ghostscript-options
+ ,(concat "-sDEVICE=" doc-view-ghostscript-device)
+ ,(format "-r%d" (round doc-view-resolution))
+ ,@(if page `(,(format "-dFirstPage=%d" page)))
+ ,@(if page `(,(format "-dLastPage=%d" page)))
+ ,@(if pdf-passwd `(,(format "-sPDFPassword=%s" pdf-passwd)))
+ ,(concat "-sOutputFile=" png)
+ ,pdf)
+ callback)))
(defalias 'doc-view-ps->png-converter-ghostscript
'doc-view-pdf->png-converter-ghostscript)
@@ -980,17 +1000,33 @@ doc-view-djvu->tiff-converter-ddjvu
,tiff)
callback))
+(defun doc-view-pdf-password-protected-pdfdraw-p (pdf)
+ "Using MuPDF, check if a PDF file is password-protected. If it is,
+return non-nil."
+ (with-temp-buffer
+ (apply #'call-process doc-view-pdfdraw-program nil (current-buffer) nil
+ ;; FIXME: See FIXME comment in `doc-view-pdf->png-converter-mupdf'.
+ `(,@(if (string-match "mutool[^/\\]*$" doc-view-pdfdraw-program) '("draw"))
+ ,(concat "-o" null-device)
+ ;; In case PDF isn't password-protected, "draw" only one page.
+ ,pdf "1"))
+ (goto-char (point-min))
+ (search-forward "error: cannot authenticate password" nil t)))
+
(defun doc-view-pdf->png-converter-mupdf (pdf png page callback)
- (doc-view-start-process
- "pdf->png" doc-view-pdfdraw-program
- ;; FIXME: Ugly hack: recent mupdf distribution replaced "mudraw" with
- ;; "mutool draw".
- `(,@(if (string-match "mutool[^/\\]*$" doc-view-pdfdraw-program) '("draw"))
- ,(concat "-o" png)
- ,(format "-r%d" (round doc-view-resolution))
- ,pdf
- ,@(if page `(,(format "%d" page))))
- callback))
+ (let ((pdf-passwd (if (doc-view-pdf-password-protected-pdfdraw-p pdf)
+ (read-passwd "Enter password for PDF file: "))))
+ (doc-view-start-process
+ "pdf->png" doc-view-pdfdraw-program
+ ;; FIXME: Ugly hack: recent mupdf distribution replaced "mudraw" with
+ ;; "mutool draw".
+ `(,@(if (string-match "mutool[^/\\]*$" doc-view-pdfdraw-program) '("draw"))
+ ,(concat "-o" png)
+ ,(format "-r%d" (round doc-view-resolution))
+ ,@(if pdf-passwd `("-p" ,pdf-passwd))
+ ,pdf
+ ,@(if page `(,(format "%d" page))))
+ callback)))
(defun doc-view-odf->pdf-converter-unoconv (odf callback)
"Convert ODF to PDF asynchronously and call CALLBACK when finished.
^ permalink raw reply related [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-02 20:58 ` Federico Tedin
@ 2019-02-03 8:40 ` Tassilo Horn
2019-02-03 16:55 ` Federico Tedin
0 siblings, 1 reply; 14+ messages in thread
From: Tassilo Horn @ 2019-02-03 8:40 UTC (permalink / raw)
To: Federico Tedin; +Cc: 33684, jidanni
Federico Tedin <federicotedin@gmail.com> writes:
Hi Federico,
> Here's the new version of the patch, which enables using MuPDF to open
> password-protected PDF files.
>
> One problem I encountered while writing it is that function
> `doc-view-pdf->png-converter-mupdf' uses a small hack to add "draw" to
> the arguments list passed to `doc-view-start-process', only when
> `doc-view-pdfdraw-program' has the value "mutool". This is because the
> "mudraw" command has been replaced at some point by the "mutool"
> command, which requires passing "draw" as a subcommand to do the same
> work. I ended up using the same hack in the new function I created,
> with a reference to the original one, but I'm not sure this was the
> best possible approach. Is there a cleaner way to solve this?
You could have extracted that into its own function, e.g.,
(defun doc-view-pdfdraw-program-subcommand ()
"Return the mutool subcommand replacing mudraw.
Recent mupdf distribution replaced mudraw with `mutool draw'."
(when (string-match "mutool[^/\\]*$" doc-view-pdfdraw-program)
'("draw")))
and use that at those two places.
Could you please commit the patch locally (including the ChangeLog style
commit message) and send it exported with "git format-patch"?
Bye,
Tassilo
PS: I had acually also accepted using the ghostscript password check
with mupdf, too. But since you don't need ghostscript for PDFs if you
have mupdf, your approach is even better.
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-03 8:40 ` Tassilo Horn
@ 2019-02-03 16:55 ` Federico Tedin
2019-02-04 5:44 ` Tassilo Horn
0 siblings, 1 reply; 14+ messages in thread
From: Federico Tedin @ 2019-02-03 16:55 UTC (permalink / raw)
To: Tassilo Horn; +Cc: 33684, jidanni
[-- Attachment #1: Type: text/plain, Size: 157 bytes --]
Hi Tassilo, thanks for your feedback. I've created a new patch with the
commit message, and also added an entry to NEWS. I'm attaching it here.
- Federico
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 5772 bytes --]
From 0fb8d45a3ab0868e0f1d81f00b0f43771510deb1 Mon Sep 17 00:00:00 2001
From: Federico Tedin <federicotedin@gmail.com>
Date: Sun, 3 Feb 2019 13:48:31 -0300
Subject: [PATCH 1/1] Allow doc-view to open password-protected PDF files
- lisp/doc-view.el (doc-view-ghostscript-options): Removed "-sDEVICE"
option.
(doc-view-ghostscript-device): New customizable variable, passed as
"-sDEVICE" option to GhostScript.
(doc-view-pdf-password-protected-ghostscript-p): New function.
(doc-view-pdf->png-converter-ghostscript): Can now open
password-protected PDF files.
(doc-view-pdfdraw-program-subcommand): New function.
(doc-view-pdf-password-protected-pdfdraw-p): New function.
(doc-view-pdf->png-converter-mupdf): Can now open password-protected
PDF files.
- etc/NEWS: Mention new doc-view-mode feature.
---
etc/NEWS | 1 +
lisp/doc-view.el | 79 ++++++++++++++++++++++++++++++++++++------------
2 files changed, 60 insertions(+), 20 deletions(-)
diff --git a/etc/NEWS b/etc/NEWS
index cac379fe7e..8aa646776c 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -329,6 +329,7 @@ the node "(emacs) Directory Variables" of the user manual.
** doc-view-mode
*** New commands doc-view-presentation and doc-view-fit-window-to-page
+*** Added support for password-protected PDF files
** map.el
*** Now also understands plists.
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index df8a9fc70f..a5fdb91a36 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -183,11 +183,16 @@ doc-view-pdf->png-converter-function
(defcustom doc-view-ghostscript-options
'("-dSAFER" ;; Avoid security problems when rendering files from untrusted
;; sources.
- "-dNOPAUSE" "-sDEVICE=png16m" "-dTextAlphaBits=4"
+ "-dNOPAUSE" "-dTextAlphaBits=4"
"-dBATCH" "-dGraphicsAlphaBits=4" "-dQUIET")
"A list of options to give to ghostscript."
:type '(repeat string))
+(defcustom doc-view-ghostscript-device "png16m"
+ "Output device to give to ghostscript."
+ :type 'string
+ :version "27.1")
+
(defcustom doc-view-resolution 100
"Dots per inch resolution used to render the documents.
Higher values result in larger images."
@@ -950,16 +955,31 @@ doc-view-dvi->pdf
(list "-o" pdf dvi)
callback)))
+(defun doc-view-pdf-password-protected-ghostscript-p (pdf)
+ "Using Ghostscript, check if a PDF file is password-protected. If it
+is, return non-nil."
+ (with-temp-buffer
+ (apply #'call-process doc-view-ghostscript-program nil (current-buffer)
+ nil `(,@doc-view-ghostscript-options
+ "-sNODISPLAY"
+ ,pdf))
+ (goto-char (point-min))
+ (search-forward "This file requires a password for access." nil t)))
+
(defun doc-view-pdf->png-converter-ghostscript (pdf png page callback)
- (doc-view-start-process
- "pdf/ps->png" doc-view-ghostscript-program
- `(,@doc-view-ghostscript-options
- ,(format "-r%d" (round doc-view-resolution))
- ,@(if page `(,(format "-dFirstPage=%d" page)))
- ,@(if page `(,(format "-dLastPage=%d" page)))
- ,(concat "-sOutputFile=" png)
- ,pdf)
- callback))
+ (let ((pdf-passwd (if (doc-view-pdf-password-protected-ghostscript-p pdf)
+ (read-passwd "Enter password for PDF file: "))))
+ (doc-view-start-process
+ "pdf/ps->png" doc-view-ghostscript-program
+ `(,@doc-view-ghostscript-options
+ ,(concat "-sDEVICE=" doc-view-ghostscript-device)
+ ,(format "-r%d" (round doc-view-resolution))
+ ,@(if page `(,(format "-dFirstPage=%d" page)))
+ ,@(if page `(,(format "-dLastPage=%d" page)))
+ ,@(if pdf-passwd `(,(format "-sPDFPassword=%s" pdf-passwd)))
+ ,(concat "-sOutputFile=" png)
+ ,pdf)
+ callback)))
(defalias 'doc-view-ps->png-converter-ghostscript
'doc-view-pdf->png-converter-ghostscript)
@@ -980,17 +1000,36 @@ doc-view-djvu->tiff-converter-ddjvu
,tiff)
callback))
+(defun doc-view-pdfdraw-program-subcommand ()
+ "Return the mutool subcommand replacing mudraw.
+Recent MuPDF distributions replaced 'mudraw' with 'mutool draw'."
+ (when (string-match "mutool[^/\\]*$" doc-view-pdfdraw-program)
+ '("draw")))
+
+(defun doc-view-pdf-password-protected-pdfdraw-p (pdf)
+ "Using MuPDF, check if a PDF file is password-protected. If it is,
+return non-nil."
+ (with-temp-buffer
+ (apply #'call-process doc-view-pdfdraw-program nil (current-buffer) nil
+ `(,@(doc-view-pdfdraw-program-subcommand)
+ ,(concat "-o" null-device)
+ ;; In case PDF isn't password-protected, "draw" only one page.
+ ,pdf "1"))
+ (goto-char (point-min))
+ (search-forward "error: cannot authenticate password" nil t)))
+
(defun doc-view-pdf->png-converter-mupdf (pdf png page callback)
- (doc-view-start-process
- "pdf->png" doc-view-pdfdraw-program
- ;; FIXME: Ugly hack: recent mupdf distribution replaced "mudraw" with
- ;; "mutool draw".
- `(,@(if (string-match "mutool[^/\\]*$" doc-view-pdfdraw-program) '("draw"))
- ,(concat "-o" png)
- ,(format "-r%d" (round doc-view-resolution))
- ,pdf
- ,@(if page `(,(format "%d" page))))
- callback))
+ (let ((pdf-passwd (if (doc-view-pdf-password-protected-pdfdraw-p pdf)
+ (read-passwd "Enter password for PDF file: "))))
+ (doc-view-start-process
+ "pdf->png" doc-view-pdfdraw-program
+ `(,@(doc-view-pdfdraw-program-subcommand)
+ ,(concat "-o" png)
+ ,(format "-r%d" (round doc-view-resolution))
+ ,@(if pdf-passwd `("-p" ,pdf-passwd))
+ ,pdf
+ ,@(if page `(,(format "%d" page))))
+ callback)))
(defun doc-view-odf->pdf-converter-unoconv (odf callback)
"Convert ODF to PDF asynchronously and call CALLBACK when finished.
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-03 16:55 ` Federico Tedin
@ 2019-02-04 5:44 ` Tassilo Horn
2019-02-04 6:29 ` Eli Zaretskii
0 siblings, 1 reply; 14+ messages in thread
From: Tassilo Horn @ 2019-02-04 5:44 UTC (permalink / raw)
To: Federico Tedin; +Cc: 33684, jidanni
Federico Tedin <federicotedin@gmail.com> writes:
Hi Federico,
> Hi Tassilo, thanks for your feedback. I've created a new patch with
> the commit message, and also added an entry to NEWS. I'm attaching it
> here.
Looks perfect. Small nitpick: we use * for bullet points instead of -
in the commit message, but I can amend that. I can't push it from work,
so I'll do it this evening.
Thanks a lot for improving doc-view!
Tassilo
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-04 5:44 ` Tassilo Horn
@ 2019-02-04 6:29 ` Eli Zaretskii
2019-02-04 6:52 ` Tassilo Horn
2019-02-04 15:49 ` Tassilo Horn
0 siblings, 2 replies; 14+ messages in thread
From: Eli Zaretskii @ 2019-02-04 6:29 UTC (permalink / raw)
To: Tassilo Horn, Federico Tedin; +Cc: 33684, jidanni
On February 4, 2019 7:44:43 AM GMT+02:00, Tassilo Horn <tsdh@gnu.org> wrote:
> Federico Tedin <federicotedin@gmail.com> writes:
>
> Hi Federico,
>
> > Hi Tassilo, thanks for your feedback. I've created a new patch with
> > the commit message, and also added an entry to NEWS. I'm attaching
> it
> > here.
>
> Looks perfect. Small nitpick: we use * for bullet points instead of -
> in the commit message, but I can amend that. I can't push it from
> work,
> so I'll do it this evening.
When you do, please be sure to amend the log message to mention the bug number.
Also, the doc strings of 2 of the new functions need to be reformatted to have the first line be a complete sentence. (Just move the second sentence to the next line, I'd say.)
Thanks.
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-04 6:29 ` Eli Zaretskii
@ 2019-02-04 6:52 ` Tassilo Horn
2019-02-04 15:49 ` Tassilo Horn
1 sibling, 0 replies; 14+ messages in thread
From: Tassilo Horn @ 2019-02-04 6:52 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 33684, Federico Tedin, jidanni
Eli Zaretskii <eliz@gnu.org> writes:
>> Looks perfect. Small nitpick: we use * for bullet points instead of -
>> in the commit message, but I can amend that. I can't push it from
>> work, so I'll do it this evening.
>
> When you do, please be sure to amend the log message to mention the
> bug number.
Ah, right!
> Also, the doc strings of 2 of the new functions need to be reformatted
> to have the first line be a complete sentence. (Just move the second
> sentence to the next line, I'd say.)
Will do.
Bye,
Tassilo
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-04 6:29 ` Eli Zaretskii
2019-02-04 6:52 ` Tassilo Horn
@ 2019-02-04 15:49 ` Tassilo Horn
2019-02-04 21:24 ` Federico Tedin
1 sibling, 1 reply; 14+ messages in thread
From: Tassilo Horn @ 2019-02-04 15:49 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Federico Tedin, 33684-done, jidanni
Eli Zaretskii <eliz@gnu.org> writes:
>> > Hi Tassilo, thanks for your feedback. I've created a new patch with
>> > the commit message, and also added an entry to NEWS. I'm attaching
>> it
>> > here.
>>
>> Looks perfect. Small nitpick: we use * for bullet points instead of
>> - in the commit message, but I can amend that. I can't push it from
>> work, so I'll do it this evening.
>
> When you do, please be sure to amend the log message to mention the
> bug number.
>
> Also, the doc strings of 2 of the new functions need to be reformatted
> to have the first line be a complete sentence. (Just move the second
> sentence to the next line, I'd say.)
Pushed with the aforementioned changes.
Thanks again, Federico!
Tassilo
^ permalink raw reply [flat|nested] 14+ messages in thread
* bug#33684: DocView bombs out upon password protected PDFs
2019-02-04 15:49 ` Tassilo Horn
@ 2019-02-04 21:24 ` Federico Tedin
0 siblings, 0 replies; 14+ messages in thread
From: Federico Tedin @ 2019-02-04 21:24 UTC (permalink / raw)
To: Tassilo Horn; +Cc: 33684-done, jidanni
> Pushed with the aforementioned changes.
>
> Thanks again, Federico!
> Tassilo
No problem! Thank you.
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2019-02-04 21:24 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-12-09 10:52 bug#33684: DocView bombs out upon password protected PDFs 積丹尼 Dan Jacobson
2019-01-27 2:14 ` Federico Tedin
2019-02-01 9:33 ` Eli Zaretskii
2019-02-01 10:12 ` Tassilo Horn
2019-02-01 10:34 ` Eli Zaretskii
2019-02-01 10:42 ` Federico Tedin
2019-02-02 20:58 ` Federico Tedin
2019-02-03 8:40 ` Tassilo Horn
2019-02-03 16:55 ` Federico Tedin
2019-02-04 5:44 ` Tassilo Horn
2019-02-04 6:29 ` Eli Zaretskii
2019-02-04 6:52 ` Tassilo Horn
2019-02-04 15:49 ` Tassilo Horn
2019-02-04 21:24 ` Federico Tedin
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.