origami 1.2.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
@@ -2,103 +2,96 @@
2
2
 
3
3
  =begin
4
4
 
5
- = Author:
6
- Guillaume Delugré <guillaume/at/security-labs.org>
5
+ = Info
6
+ Uncompresses all binary streams of a PDF document.
7
7
 
8
- = Info:
9
- Uncompresses all binary streams of a PDF document.
8
+ = License
9
+ Copyright (C) 2016 Guillaume Delugré.
10
10
 
11
- = License:
12
- Origami is free software: you can redistribute it and/or modify
13
- it under the terms of the GNU Lesser General Public License as published by
14
- the Free Software Foundation, either version 3 of the License, or
15
- (at your option) any later version.
11
+ Origami is free software: you can redistribute it and/or modify
12
+ it under the terms of the GNU Lesser General Public License as published by
13
+ the Free Software Foundation, either version 3 of the License, or
14
+ (at your option) any later version.
16
15
 
17
- Origami is distributed in the hope that it will be useful,
18
- but WITHOUT ANY WARRANTY; without even the implied warranty of
19
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
- GNU Lesser General Public License for more details.
16
+ Origami is distributed in the hope that it will be useful,
17
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ GNU Lesser General Public License for more details.
21
20
 
22
- You should have received a copy of the GNU Lesser General Public License
23
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
21
+ You should have received a copy of the GNU Lesser General Public License
22
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
24
23
 
25
24
  =end
26
25
 
27
26
  begin
28
- require 'origami'
27
+ require 'origami'
29
28
  rescue LoadError
30
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../lib"
31
- $: << ORIGAMIDIR
32
- require 'origami'
29
+ $: << File.join(__dir__, '../lib')
30
+ require 'origami'
33
31
  end
34
32
  include Origami
35
33
 
36
34
  require 'optparse'
37
35
 
38
36
  class OptParser
39
- BANNER = <<USAGE
37
+ BANNER = <<USAGE
40
38
  Usage: #{$0} [<PDF-file>] [-p <password>] [-o <output-file>]
41
39
  Uncompresses all binary streams of a PDF document.
42
- Bug reports or feature requests at: http://origami-pdf.googlecode.com/
40
+ Bug reports or feature requests at: http://github.com/gdelugre/origami
43
41
 
44
42
  Options:
45
43
  USAGE
46
44
 
47
- def self.parser(options)
48
- OptionParser.new do |opts|
49
- opts.banner = BANNER
45
+ def self.parser(options)
46
+ OptionParser.new do |opts|
47
+ opts.banner = BANNER
50
48
 
51
- opts.on("-o", "--output FILE", "Output PDF file (stdout by default)") do |o|
52
- options[:output] = o
53
- end
49
+ opts.on("-o", "--output FILE", "Output PDF file (stdout by default)") do |o|
50
+ options[:output] = o
51
+ end
54
52
 
55
- opts.on_tail("-h", "--help", "Show this message") do
56
- puts opts
57
- exit
58
- end
53
+ opts.on_tail("-h", "--help", "Show this message") do
54
+ puts opts
55
+ exit
56
+ end
57
+ end
59
58
  end
60
- end
61
59
 
62
- def self.parse(args)
63
- options =
64
- {
65
- :output => STDOUT,
66
- }
60
+ def self.parse(args)
61
+ options =
62
+ {
63
+ output: STDOUT,
64
+ }
67
65
 
68
- self.parser(options).parse!(args)
66
+ self.parser(options).parse!(args)
69
67
 
70
- options
71
- end
68
+ options
69
+ end
72
70
  end
73
71
 
74
72
  begin
75
- @options = OptParser.parse(ARGV)
73
+ @options = OptParser.parse(ARGV)
76
74
 
77
- target = (ARGV.empty?) ? STDIN : ARGV.shift
78
- params =
79
- {
80
- :verbosity => Parser::VERBOSE_QUIET,
81
- }
75
+ target = (ARGV.empty?) ? STDIN : ARGV.shift
76
+ params =
77
+ {
78
+ verbosity: Parser::VERBOSE_QUIET,
79
+ }
82
80
 
83
- pdf = PDF.read(target, params)
81
+ pdf = PDF.read(target, params)
84
82
 
85
- pdf.root_objects.find_all { |obj|
86
- obj.is_a?(Stream)
87
- }.each { |stream|
88
- filters = stream.Filter
89
- filters = [ filters ] unless filters.is_a?(::Array)
83
+ pdf.root_objects.find_all { |obj|
84
+ obj.is_a?(Stream)
85
+ }.each { |stream|
86
+ unless stream.filters.any?{|filter| %i[JPXDecode DCTDecode JBIG2Decode].include?(filter.value) }
87
+ stream.encoded_data = stream.data
88
+ stream.dictionary.delete(:Filter)
89
+ end
90
+ }
90
91
 
91
- unless filters.any?{|filter| [ :JPXDecode, :DCTDecode, :JBIG2Decode ].include? filter}
92
- stream.rawdata = stream.data
93
- stream.dictionary.delete(:Filter)
94
- end
95
- }
96
-
97
- pdf.save(@options[:output], :noindent => true)
98
-
99
- rescue SystemExit
100
- rescue Exception => e
101
- STDERR.puts "#{e.class}: #{e.message}"
102
- exit 1
103
- end
92
+ pdf.save(@options[:output], noindent: true)
104
93
 
94
+ rescue
95
+ STDERR.puts $!.backtrace.join($/)
96
+ abort "#{$!.class}: #{$!.message}"
97
+ end
@@ -1,95 +1,91 @@
1
- #!/usr/bin/env ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
3
  =begin
4
4
 
5
- = Author:
6
- Guillaume Delugré <guillaume/at/security-labs.org>
5
+ = Info
6
+ Decrypts a PDF document.
7
7
 
8
- = Info:
9
- Decrypts a PDF document.
8
+ = License
9
+ Copyright (C) 2016 Guillaume Delugré.
10
10
 
11
- = License:
12
- Origami is free software: you can redistribute it and/or modify
13
- it under the terms of the GNU Lesser General Public License as published by
14
- the Free Software Foundation, either version 3 of the License, or
15
- (at your option) any later version.
11
+ Origami is free software: you can redistribute it and/or modify
12
+ it under the terms of the GNU Lesser General Public License as published by
13
+ the Free Software Foundation, either version 3 of the License, or
14
+ (at your option) any later version.
16
15
 
17
- Origami is distributed in the hope that it will be useful,
18
- but WITHOUT ANY WARRANTY; without even the implied warranty of
19
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
- GNU Lesser General Public License for more details.
16
+ Origami is distributed in the hope that it will be useful,
17
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ GNU Lesser General Public License for more details.
21
20
 
22
- You should have received a copy of the GNU Lesser General Public License
23
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
21
+ You should have received a copy of the GNU Lesser General Public License
22
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
24
23
 
25
24
  =end
26
25
 
27
26
  begin
28
- require 'origami'
27
+ require 'origami'
29
28
  rescue LoadError
30
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../lib"
31
- $: << ORIGAMIDIR
32
- require 'origami'
29
+ $: << File.join(__dir__, '../lib')
30
+ require 'origami'
33
31
  end
34
32
  include Origami
35
33
 
36
34
  require 'optparse'
37
35
 
38
36
  class OptParser
39
- BANNER = <<USAGE
37
+ BANNER = <<USAGE
40
38
  Usage: #{$0} [<PDF-file>] [-p <password>] [-o <output-file>]
41
39
  Decrypts a PDF document. Supports RC4 40 to 128 bits, AES128, AES256.
42
- Bug reports or feature requests at: http://origami-pdf.googlecode.com/
40
+ Bug reports or feature requests at: http://github.com/gdelugre/origami
43
41
 
44
42
  Options:
45
43
  USAGE
46
44
 
47
- def self.parser(options)
48
- OptionParser.new do |opts|
49
- opts.banner = BANNER
45
+ def self.parser(options)
46
+ OptionParser.new do |opts|
47
+ opts.banner = BANNER
50
48
 
51
- opts.on("-o", "--output FILE", "Output PDF file (stdout by default)") do |o|
52
- options[:output] = o
53
- end
49
+ opts.on("-o", "--output FILE", "Output PDF file (stdout by default)") do |o|
50
+ options[:output] = o
51
+ end
54
52
 
55
- opts.on("-p", "--password PASSWORD", "Password of the document") do |p|
56
- options[:password] = p
57
- end
53
+ opts.on("-p", "--password PASSWORD", "Password of the document") do |p|
54
+ options[:password] = p
55
+ end
58
56
 
59
- opts.on_tail("-h", "--help", "Show this message") do
60
- puts opts
61
- exit
62
- end
57
+ opts.on_tail("-h", "--help", "Show this message") do
58
+ puts opts
59
+ exit
60
+ end
61
+ end
63
62
  end
64
- end
65
63
 
66
- def self.parse(args)
67
- options =
68
- {
69
- :output => STDOUT,
70
- :password => ''
71
- }
64
+ def self.parse(args)
65
+ options =
66
+ {
67
+ output: STDOUT,
68
+ password: ''
69
+ }
72
70
 
73
- self.parser(options).parse!(args)
71
+ self.parser(options).parse!(args)
74
72
 
75
- options
76
- end
73
+ options
74
+ end
77
75
  end
78
76
 
79
77
  begin
80
- @options = OptParser.parse(ARGV)
81
-
82
- target = (ARGV.empty?) ? STDIN : ARGV.shift
83
- params =
84
- {
85
- :verbosity => Parser::VERBOSE_QUIET,
86
- :password => @options[:password]
87
- }
88
-
89
- PDF.read(target, params).save(@options[:output], :decrypt => true, :noindent => true)
90
- rescue SystemExit
91
- rescue Exception => e
92
- STDERR.puts "#{e.class}: #{e.message}"
93
- exit 1
94
- end
78
+ @options = OptParser.parse(ARGV)
95
79
 
80
+ target = (ARGV.empty?) ? STDIN : ARGV.shift
81
+ params =
82
+ {
83
+ verbosity: Parser::VERBOSE_QUIET,
84
+ password: @options[:password]
85
+ }
86
+
87
+ PDF.read(target, params).save(@options[:output], decrypt: true, noindent: true)
88
+
89
+ rescue
90
+ abort "#{$!.class}: #{$!.message}"
91
+ end
@@ -1,118 +1,113 @@
1
- #!/usr/bin/env ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
3
  =begin
4
4
 
5
- = Author:
6
- Guillaume Delugré <guillaume/at/security-labs.org>
5
+ = Info
6
+ Encrypts a PDF document.
7
7
 
8
- = Info:
9
- Encrypts a PDF document.
8
+ = License
9
+ Copyright (C) 2016 Guillaume Delugré.
10
10
 
11
- = License:
12
- Origami is free software: you can redistribute it and/or modify
13
- it under the terms of the GNU Lesser General Public License as published by
14
- the Free Software Foundation, either version 3 of the License, or
15
- (at your option) any later version.
11
+ Origami is free software: you can redistribute it and/or modify
12
+ it under the terms of the GNU Lesser General Public License as published by
13
+ the Free Software Foundation, either version 3 of the License, or
14
+ (at your option) any later version.
16
15
 
17
- Origami is distributed in the hope that it will be useful,
18
- but WITHOUT ANY WARRANTY; without even the implied warranty of
19
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
- GNU Lesser General Public License for more details.
16
+ Origami is distributed in the hope that it will be useful,
17
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ GNU Lesser General Public License for more details.
21
20
 
22
- You should have received a copy of the GNU Lesser General Public License
23
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
21
+ You should have received a copy of the GNU Lesser General Public License
22
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
24
23
 
25
24
  =end
26
25
 
27
26
  begin
28
- require 'origami'
27
+ require 'origami'
29
28
  rescue LoadError
30
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../lib"
31
- $: << ORIGAMIDIR
32
- require 'origami'
29
+ $: << File.join(__dir__, '../lib')
30
+ require 'origami'
33
31
  end
34
32
  include Origami
35
33
 
36
34
  require 'optparse'
37
35
 
38
36
  class OptParser
39
- BANNER = <<USAGE
37
+ BANNER = <<USAGE
40
38
  Usage: #{$0} [<PDF-file>] [-p <password>] [-c <cipher>] [-s <key-size>] [--hardened] [-o <output-file>]
41
39
  Encrypts a PDF document. Supports RC4 40 to 128 bits, AES128, AES256.
42
- Bug reports or feature requests at: http://origami-pdf.googlecode.com/
40
+ Bug reports or feature requests at: http://github.com/gdelugre/origami
43
41
 
44
42
  Options:
45
43
  USAGE
46
44
 
47
- def self.parser(options)
48
- OptionParser.new do |opts|
49
- opts.banner = BANNER
45
+ def self.parser(options)
46
+ OptionParser.new do |opts|
47
+ opts.banner = BANNER
50
48
 
51
- opts.on("-o", "--output FILE", "Output PDF file (stdout by default)") do |o|
52
- options[:output] = o
53
- end
49
+ opts.on("-o", "--output FILE", "Output PDF file (stdout by default)") do |o|
50
+ options[:output] = o
51
+ end
54
52
 
55
- opts.on("-p", "--password PASSWORD", "Password of the document") do |p|
56
- options[:password] = p
57
- end
53
+ opts.on("-p", "--password PASSWORD", "Password of the document") do |p|
54
+ options[:password] = p
55
+ end
58
56
 
59
- opts.on("-c", "--cipher CIPHER", "Cipher used to encrypt the document (Default: AES)") do |c|
60
- options[:cipher] = c
61
- end
57
+ opts.on("-c", "--cipher CIPHER", "Cipher used to encrypt the document (Default: AES)") do |c|
58
+ options[:cipher] = c
59
+ end
62
60
 
63
- opts.on("-s", "--key-size KEYSIZE", "Key size in bits (Default: 128)") do |s|
64
- options[:key_size] = s.to_i
65
- end
61
+ opts.on("-s", "--key-size KEYSIZE", "Key size in bits (Default: 128)") do |s|
62
+ options[:key_size] = s.to_i
63
+ end
66
64
 
67
- opts.on("--hardened", "Use stronger key validation scheme (only AES-256)") do
68
- options[:hardened] = true
69
- end
65
+ opts.on("--hardened", "Use stronger key validation scheme (only AES-256)") do
66
+ options[:hardened] = true
67
+ end
70
68
 
71
- opts.on_tail("-h", "--help", "Show this message") do
72
- puts opts
73
- exit
74
- end
69
+ opts.on_tail("-h", "--help", "Show this message") do
70
+ puts opts
71
+ exit
72
+ end
73
+ end
75
74
  end
76
- end
77
75
 
78
- def self.parse(args)
79
- options =
80
- {
81
- :output => STDOUT,
82
- :password => '',
83
- :cipher => 'aes',
84
- :key_size => 128,
85
- :hardened => false
86
- }
76
+ def self.parse(args)
77
+ options =
78
+ {
79
+ output: STDOUT,
80
+ password: '',
81
+ cipher: 'aes',
82
+ key_size: 128,
83
+ hardened: false
84
+ }
87
85
 
88
- self.parser(options).parse!(args)
86
+ self.parser(options).parse!(args)
89
87
 
90
- options
91
- end
88
+ options
89
+ end
92
90
  end
93
91
 
94
92
  begin
95
- @options = OptParser.parse(ARGV)
96
-
97
- target = (ARGV.empty?) ? STDIN : ARGV.shift
98
- params =
99
- {
100
- :verbosity => Parser::VERBOSE_QUIET,
101
- }
102
-
103
- pdf = PDF.read(target, params)
104
- pdf.encrypt(
105
- :user_passwd => @options[:password],
106
- :owner_passwd => @options[:password],
107
- :cipher => @options[:cipher],
108
- :key_size => @options[:key_size],
109
- :hardened => @options[:hardened]
110
- )
111
- pdf.save(@options[:output], :noindent => true)
112
-
113
- rescue SystemExit
114
- rescue Exception => e
115
- STDERR.puts "#{e.class}: #{e.message} #{e.backtrace}"
116
- exit 1
117
- end
93
+ @options = OptParser.parse(ARGV)
118
94
 
95
+ target = (ARGV.empty?) ? STDIN : ARGV.shift
96
+ params =
97
+ {
98
+ verbosity: Parser::VERBOSE_QUIET,
99
+ }
100
+
101
+ pdf = PDF.read(target, params)
102
+ pdf.encrypt(
103
+ user_passwd: @options[:password],
104
+ owner_passwd: @options[:password],
105
+ cipher: @options[:cipher],
106
+ key_size: @options[:key_size],
107
+ hardened: @options[:hardened]
108
+ )
109
+ pdf.save(@options[:output], noindent: true)
110
+
111
+ rescue
112
+ abort "#{$!.class}: #{$!.message}"
113
+ end