rubrik 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a41daeeefd22b755dd4ae91177d7142e46eff64f5d1877a1c303f4885634f1a2
4
- data.tar.gz: d205242211ab51a47a2ac8db5a89267bf90f2e2576450d60311e3de8a5b33d82
3
+ metadata.gz: 1092e4bfdff7f05272eab8cf226a09b54737f368c24e883370002a399036ce4a
4
+ data.tar.gz: 818072d3ea9003599a9ec5fb49af2df99f3f43045e9aa6a81a1e62e8f2c11fd3
5
5
  SHA512:
6
- metadata.gz: 4e73a024012af2d658489a007a449ed05270c02ccbaf4fa9c49930827e98aeb4bc1ea71f70e1c923e7d5fafe17e334f27b5ae66a4e3f49959f34ea8e6836ec58
7
- data.tar.gz: 23a4ca82df06a937feb613b5320351d44067c0a7db596ccc854486256609856f97361011be725cf987ede6fd7e6e9a2d4c7249ba8683ef010b5718e302fa0e8d
6
+ metadata.gz: 173091b0ab44b398a10260e267de6ff92fe8083d2668dabe86e79bdb93547151ad9b73e08296c955e3e604ebba4b1f9f74fc44ae91ef661839883cd96f71fe9d
7
+ data.tar.gz: 60a0c1647190a473703ac1ae1cf1e5d407bc59e4f599b1de6d3111c3dd7105fa8077ec7955fed5df1c5c088dc9a515e7b5b3bd1987a0d42dc2835f5ca8585313
@@ -15,14 +15,14 @@ module Rubrik
15
15
  serialized_objs = obj.flatten.map { |e| SerializeObject[e] }
16
16
  "<<#{serialized_objs.join(" ")}>>"
17
17
  when Symbol
18
- "/#{obj}"
18
+ serialize_symbol(obj)
19
19
  when Array
20
20
  serialized_objs = obj.map { |e| SerializeObject[e] }
21
21
  "[#{serialized_objs.join(" ")}]"
22
22
  when PDF::Reader::Reference
23
23
  "#{obj.id} #{obj.gen} R"
24
24
  when String
25
- "(#{obj})"
25
+ serialize_string(obj)
26
26
  when TrueClass
27
27
  "true"
28
28
  when FalseClass
@@ -48,6 +48,43 @@ module Rubrik
48
48
  end
49
49
 
50
50
  alias call []
51
+
52
+ private
53
+
54
+ STRING_ESCAPE_MAP = {
55
+ "\n" => "\\\n",
56
+ "\r" => "\\\r",
57
+ "\t" => "\\\t",
58
+ "\b" => "\\\b",
59
+ "\f" => "\\\f",
60
+ "\\" => "\\\\",
61
+ "(" => "\\(",
62
+ ")" => "\\)"
63
+ }.freeze
64
+
65
+ sig {params(string: String).returns(String)}
66
+ def serialize_string(string)
67
+ "(#{string.gsub(/[\n\r\t\b\f\\()]/n, STRING_ESCAPE_MAP)})"
68
+ end
69
+
70
+ DELIMITERS = "()<>[]{}/%".bytes.freeze
71
+ REGULAR_CHARACTERS =
72
+ "!\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~".bytes.freeze
73
+
74
+
75
+ NAME_ESCAPE_CHARACTERS = (0..255).to_a - REGULAR_CHARACTERS + DELIMITERS + "#".bytes
76
+ NAME_ESCAPE_CHARACTERS.freeze
77
+
78
+ NAME_ESCAPE_MAP = NAME_ESCAPE_CHARACTERS.each_with_object({}) do |char, escape_map|
79
+ escape_map[char.chr] = "##{char.to_s(16).rjust(2, "0")}"
80
+ end.freeze
81
+
82
+ NAME_ESCAPE_REGEX = /[#{Regexp.escape(NAME_ESCAPE_CHARACTERS.map(&:chr).join)}]/
83
+
84
+ sig {params(symbol: Symbol).returns(String)}
85
+ def serialize_symbol(symbol)
86
+ "/#{symbol.to_s.b.gsub(NAME_ESCAPE_REGEX, NAME_ESCAPE_MAP)}"
87
+ end
51
88
  end
52
89
  end
53
90
  end
@@ -91,7 +91,15 @@ module Rubrik
91
91
  modified_objects << {id: first_page_reference, value: new_first_page}
92
92
  end
93
93
 
94
- (interactive_form[:Fields] ||= []) << signature_field_id
94
+ fields_entry = interactive_form[:Fields]
95
+ if fields_entry.is_a?(PDF::Reader::Reference)
96
+ new_fields_array = objects.fetch(fields_entry).dup
97
+ new_fields_array << signature_field_id
98
+
99
+ modified_objects << {id: fields_entry, value: new_fields_array}
100
+ else
101
+ (interactive_form[:Fields] ||= []) << signature_field_id
102
+ end
95
103
 
96
104
  signature_value_id
97
105
  end
@@ -118,11 +126,22 @@ module Rubrik
118
126
  root_ref = objects.trailer[:Root]
119
127
  root = T.let(objects.fetch(root_ref), T::Hash[Symbol, T.untyped])
120
128
 
121
- if root.key?(:AcroForm)
129
+ interactive_form_value = root[:AcroForm]
130
+ case interactive_form_value
131
+ when PDF::Reader::Reference
122
132
  form_id = root[:AcroForm]
123
133
 
124
134
  modified_objects << {id: form_id, value: objects.fetch(form_id).dup}
125
- else
135
+ when Hash
136
+ interactive_form_id = assign_new_object_id!
137
+
138
+ modified_objects << {id: interactive_form_id, value: interactive_form_value.dup}
139
+
140
+ new_root = root.dup
141
+ new_root[:AcroForm] = interactive_form_id
142
+
143
+ modified_objects << {id: root_ref, value: new_root}
144
+ when NilClass
126
145
  interactive_form_id = assign_new_object_id!
127
146
  modified_objects << {id: interactive_form_id, value: {Fields: []}}
128
147
 
@@ -131,6 +150,10 @@ module Rubrik
131
150
  updated_root[:AcroForm] = interactive_form_id
132
151
 
133
152
  modified_objects << {id: root_ref, value: updated_root}
153
+ else
154
+ raise Error.new(
155
+ "Expected dictionary, reference or nil but got " \
156
+ "#{interactive_form_value.class} on AcroForm entry.")
134
157
  end
135
158
 
136
159
  interactive_form[:SigFlags] = 3 # dont modify, append only
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rubrik
4
- VERSION = "1.0.1"
4
+ VERSION = "1.1.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubrik
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomás Coêlho
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-29 00:00:00.000000000 Z
11
+ date: 2023-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pdf-reader