rubrik 1.0.1 → 1.1.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.
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