pdf-reader 2.7.0 → 2.9.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG +20 -0
- data/Rakefile +1 -1
- data/lib/pdf/reader/aes_v2_security_handler.rb +41 -0
- data/lib/pdf/reader/aes_v3_security_handler.rb +38 -0
- data/lib/pdf/reader/bounding_rectangle_runs_filter.rb +16 -0
- data/lib/pdf/reader/buffer.rb +36 -34
- data/lib/pdf/reader/cmap.rb +64 -51
- data/lib/pdf/reader/error.rb +8 -0
- data/lib/pdf/reader/filter/ascii85.rb +1 -1
- data/lib/pdf/reader/filter/ascii_hex.rb +1 -1
- data/lib/pdf/reader/filter/depredict.rb +1 -1
- data/lib/pdf/reader/filter/flate.rb +3 -3
- data/lib/pdf/reader/filter/lzw.rb +1 -1
- data/lib/pdf/reader/filter/null.rb +1 -2
- data/lib/pdf/reader/filter/run_length.rb +1 -1
- data/lib/pdf/reader/filter.rb +10 -11
- data/lib/pdf/reader/font.rb +71 -16
- data/lib/pdf/reader/font_descriptor.rb +18 -17
- data/lib/pdf/reader/form_xobject.rb +14 -5
- data/lib/pdf/reader/key_builder_v5.rb +138 -0
- data/lib/pdf/reader/null_security_handler.rb +0 -4
- data/lib/pdf/reader/object_hash.rb +251 -44
- data/lib/pdf/reader/page.rb +51 -22
- data/lib/pdf/reader/page_layout.rb +14 -28
- data/lib/pdf/reader/page_state.rb +1 -1
- data/lib/pdf/reader/page_text_receiver.rb +52 -10
- data/lib/pdf/reader/parser.rb +22 -7
- data/lib/pdf/reader/point.rb +1 -1
- data/lib/pdf/reader/rc4_security_handler.rb +38 -0
- data/lib/pdf/reader/rectangle.rb +20 -2
- data/lib/pdf/reader/{resource_methods.rb → resources.rb} +15 -13
- data/lib/pdf/reader/security_handler_factory.rb +79 -0
- data/lib/pdf/reader/{standard_security_handler.rb → standard_key_builder.rb} +23 -95
- data/lib/pdf/reader/stream.rb +2 -2
- data/lib/pdf/reader/text_run.rb +13 -6
- data/lib/pdf/reader/type_check.rb +52 -0
- data/lib/pdf/reader/validating_receiver.rb +262 -0
- data/lib/pdf/reader/width_calculator/true_type.rb +1 -1
- data/lib/pdf/reader/xref.rb +20 -3
- data/lib/pdf/reader.rb +32 -11
- data/rbi/pdf-reader.rbi +408 -174
- metadata +16 -9
- data/lib/pdf/reader/standard_security_handler_v5.rb +0 -92
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdf-reader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Healy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -200,6 +200,8 @@ files:
|
|
200
200
|
- examples/version.rb
|
201
201
|
- lib/pdf-reader.rb
|
202
202
|
- lib/pdf/reader.rb
|
203
|
+
- lib/pdf/reader/aes_v2_security_handler.rb
|
204
|
+
- lib/pdf/reader/aes_v3_security_handler.rb
|
203
205
|
- lib/pdf/reader/afm/Courier-Bold.afm
|
204
206
|
- lib/pdf/reader/afm/Courier-BoldOblique.afm
|
205
207
|
- lib/pdf/reader/afm/Courier-Oblique.afm
|
@@ -215,6 +217,7 @@ files:
|
|
215
217
|
- lib/pdf/reader/afm/Times-Italic.afm
|
216
218
|
- lib/pdf/reader/afm/Times-Roman.afm
|
217
219
|
- lib/pdf/reader/afm/ZapfDingbats.afm
|
220
|
+
- lib/pdf/reader/bounding_rectangle_runs_filter.rb
|
218
221
|
- lib/pdf/reader/buffer.rb
|
219
222
|
- lib/pdf/reader/cid_widths.rb
|
220
223
|
- lib/pdf/reader/cmap.rb
|
@@ -241,6 +244,7 @@ files:
|
|
241
244
|
- lib/pdf/reader/glyph_hash.rb
|
242
245
|
- lib/pdf/reader/glyphlist-zapfdingbats.txt
|
243
246
|
- lib/pdf/reader/glyphlist.txt
|
247
|
+
- lib/pdf/reader/key_builder_v5.rb
|
244
248
|
- lib/pdf/reader/lzw.rb
|
245
249
|
- lib/pdf/reader/null_security_handler.rb
|
246
250
|
- lib/pdf/reader/object_cache.rb
|
@@ -255,18 +259,21 @@ files:
|
|
255
259
|
- lib/pdf/reader/parser.rb
|
256
260
|
- lib/pdf/reader/point.rb
|
257
261
|
- lib/pdf/reader/print_receiver.rb
|
262
|
+
- lib/pdf/reader/rc4_security_handler.rb
|
258
263
|
- lib/pdf/reader/rectangle.rb
|
259
264
|
- lib/pdf/reader/reference.rb
|
260
265
|
- lib/pdf/reader/register_receiver.rb
|
261
|
-
- lib/pdf/reader/
|
262
|
-
- lib/pdf/reader/
|
263
|
-
- lib/pdf/reader/
|
266
|
+
- lib/pdf/reader/resources.rb
|
267
|
+
- lib/pdf/reader/security_handler_factory.rb
|
268
|
+
- lib/pdf/reader/standard_key_builder.rb
|
264
269
|
- lib/pdf/reader/stream.rb
|
265
270
|
- lib/pdf/reader/synchronized_cache.rb
|
266
271
|
- lib/pdf/reader/text_run.rb
|
267
272
|
- lib/pdf/reader/token.rb
|
268
273
|
- lib/pdf/reader/transformation_matrix.rb
|
274
|
+
- lib/pdf/reader/type_check.rb
|
269
275
|
- lib/pdf/reader/unimplemented_security_handler.rb
|
276
|
+
- lib/pdf/reader/validating_receiver.rb
|
270
277
|
- lib/pdf/reader/width_calculator.rb
|
271
278
|
- lib/pdf/reader/width_calculator/built_in.rb
|
272
279
|
- lib/pdf/reader/width_calculator/composite.rb
|
@@ -281,9 +288,9 @@ licenses:
|
|
281
288
|
- MIT
|
282
289
|
metadata:
|
283
290
|
bug_tracker_uri: https://github.com/yob/pdf-reader/issues
|
284
|
-
changelog_uri: https://github.com/yob/pdf-reader/blob/v2.
|
285
|
-
documentation_uri: https://www.rubydoc.info/gems/pdf-reader/2.
|
286
|
-
source_code_uri: https://github.com/yob/pdf-reader/tree/v2.
|
291
|
+
changelog_uri: https://github.com/yob/pdf-reader/blob/v2.9.2/CHANGELOG
|
292
|
+
documentation_uri: https://www.rubydoc.info/gems/pdf-reader/2.9.2
|
293
|
+
source_code_uri: https://github.com/yob/pdf-reader/tree/v2.9.2
|
287
294
|
post_install_message:
|
288
295
|
rdoc_options:
|
289
296
|
- "--title"
|
@@ -304,7 +311,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
304
311
|
- !ruby/object:Gem::Version
|
305
312
|
version: '0'
|
306
313
|
requirements: []
|
307
|
-
rubygems_version: 3.2.
|
314
|
+
rubygems_version: 3.2.32
|
308
315
|
signing_key:
|
309
316
|
specification_version: 4
|
310
317
|
summary: A library for accessing the content of PDF files
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
# typed: true
|
3
|
-
# frozen_string_literal: true
|
4
|
-
|
5
|
-
require 'digest'
|
6
|
-
require 'openssl'
|
7
|
-
|
8
|
-
class PDF::Reader
|
9
|
-
|
10
|
-
# class creates interface to encrypt dictionary for use in Decrypt
|
11
|
-
class StandardSecurityHandlerV5
|
12
|
-
|
13
|
-
attr_reader :key_length, :encrypt_key
|
14
|
-
|
15
|
-
def initialize(opts = {})
|
16
|
-
@key_length = 256
|
17
|
-
@O = opts[:O] # hash(32B) + validation salt(8B) + key salt(8B)
|
18
|
-
@U = opts[:U] # hash(32B) + validation salt(8B) + key salt(8B)
|
19
|
-
@OE = opts[:OE] # decryption key, encrypted w/ owner password
|
20
|
-
@UE = opts[:UE] # decryption key, encrypted w/ user password
|
21
|
-
@encrypt_key = build_standard_key(opts[:password] || '')
|
22
|
-
end
|
23
|
-
|
24
|
-
# This handler supports AES-256 encryption defined in PDF 1.7 Extension Level 3
|
25
|
-
def self.supports?(encrypt)
|
26
|
-
return false if encrypt.nil?
|
27
|
-
|
28
|
-
filter = encrypt.fetch(:Filter, :Standard)
|
29
|
-
version = encrypt.fetch(:V, 0)
|
30
|
-
revision = encrypt.fetch(:R, 0)
|
31
|
-
algorithm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
|
32
|
-
(filter == :Standard) && (encrypt[:StmF] == encrypt[:StrF]) &&
|
33
|
-
((version == 5) && (revision == 5) && (algorithm == :AESV3))
|
34
|
-
end
|
35
|
-
|
36
|
-
##7.6.2 General Encryption Algorithm
|
37
|
-
#
|
38
|
-
# Algorithm 1: Encryption of data using the RC4 or AES algorithms
|
39
|
-
#
|
40
|
-
# used to decrypt RC4/AES encrypted PDF streams (buf)
|
41
|
-
#
|
42
|
-
# buf - a string to decrypt
|
43
|
-
# ref - a PDF::Reader::Reference for the object to decrypt
|
44
|
-
#
|
45
|
-
def decrypt( buf, ref )
|
46
|
-
cipher = OpenSSL::Cipher.new("AES-#{@key_length}-CBC")
|
47
|
-
cipher.decrypt
|
48
|
-
cipher.key = @encrypt_key.dup
|
49
|
-
cipher.iv = buf[0..15]
|
50
|
-
cipher.update(buf[16..-1]) + cipher.final
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
# Algorithm 3.2a - Computing an encryption key
|
55
|
-
#
|
56
|
-
# Defined in PDF 1.7 Extension Level 3
|
57
|
-
#
|
58
|
-
# if the string is a valid user/owner password, this will return the decryption key
|
59
|
-
#
|
60
|
-
def auth_owner_pass(password)
|
61
|
-
if Digest::SHA256.digest(password + @O[32..39] + @U) == @O[0..31]
|
62
|
-
cipher = OpenSSL::Cipher.new('AES-256-CBC')
|
63
|
-
cipher.decrypt
|
64
|
-
cipher.key = Digest::SHA256.digest(password + @O[40..-1] + @U)
|
65
|
-
cipher.iv = "\x00" * 16
|
66
|
-
cipher.padding = 0
|
67
|
-
cipher.update(@OE) + cipher.final
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def auth_user_pass(password)
|
72
|
-
if Digest::SHA256.digest(password + @U[32..39]) == @U[0..31]
|
73
|
-
cipher = OpenSSL::Cipher.new('AES-256-CBC')
|
74
|
-
cipher.decrypt
|
75
|
-
cipher.key = Digest::SHA256.digest(password + @U[40..-1])
|
76
|
-
cipher.iv = "\x00" * 16
|
77
|
-
cipher.padding = 0
|
78
|
-
cipher.update(@UE) + cipher.final
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def build_standard_key(pass)
|
83
|
-
pass = pass.byteslice(0...127) # UTF-8 encoded password. first 127 bytes
|
84
|
-
|
85
|
-
encrypt_key = auth_owner_pass(pass)
|
86
|
-
encrypt_key ||= auth_user_pass(pass)
|
87
|
-
|
88
|
-
raise PDF::Reader::EncryptedPDFError, "Invalid password (#{pass})" if encrypt_key.nil?
|
89
|
-
encrypt_key
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|