origami 1.2.7 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -0
- data/README.md +112 -0
- data/bin/config/pdfcop.conf.yml +232 -233
- data/bin/gui/about.rb +27 -37
- data/bin/gui/config.rb +108 -117
- data/bin/gui/file.rb +416 -365
- data/bin/gui/gtkhex.rb +1138 -1153
- data/bin/gui/hexview.rb +55 -57
- data/bin/gui/imgview.rb +48 -51
- data/bin/gui/menu.rb +388 -386
- data/bin/gui/properties.rb +114 -130
- data/bin/gui/signing.rb +571 -617
- data/bin/gui/textview.rb +77 -95
- data/bin/gui/treeview.rb +382 -387
- data/bin/gui/walker.rb +227 -232
- data/bin/gui/xrefs.rb +56 -60
- data/bin/pdf2pdfa +53 -57
- data/bin/pdf2ruby +212 -228
- data/bin/pdfcop +338 -348
- data/bin/pdfdecompress +58 -65
- data/bin/pdfdecrypt +56 -60
- data/bin/pdfencrypt +75 -80
- data/bin/pdfexplode +185 -182
- data/bin/pdfextract +201 -218
- data/bin/pdfmetadata +83 -82
- data/bin/pdfsh +4 -5
- data/bin/pdfwalker +1 -2
- data/bin/shell/.irbrc +45 -82
- data/bin/shell/console.rb +105 -130
- data/bin/shell/hexdump.rb +40 -64
- data/examples/README.md +34 -0
- data/examples/attachments/attachment.rb +38 -0
- data/examples/attachments/nested_document.rb +51 -0
- data/examples/encryption/encryption.rb +28 -0
- data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
- data/examples/flash/flash.rb +37 -0
- data/{samples → examples}/flash/helloworld.swf +0 -0
- data/examples/forms/javascript.rb +54 -0
- data/examples/forms/xfa.rb +115 -0
- data/examples/javascript/hello_world.rb +22 -0
- data/examples/javascript/js_emulation.rb +54 -0
- data/examples/loop/goto.rb +32 -0
- data/examples/loop/named.rb +33 -0
- data/examples/signature/signature.rb +65 -0
- data/examples/uri/javascript.rb +56 -0
- data/examples/uri/open-uri.rb +21 -0
- data/examples/uri/submitform.rb +47 -0
- data/lib/origami.rb +29 -42
- data/lib/origami/3d.rb +350 -225
- data/lib/origami/acroform.rb +262 -288
- data/lib/origami/actions.rb +268 -288
- data/lib/origami/annotations.rb +697 -722
- data/lib/origami/array.rb +258 -184
- data/lib/origami/boolean.rb +74 -84
- data/lib/origami/catalog.rb +397 -434
- data/lib/origami/collections.rb +144 -0
- data/lib/origami/destinations.rb +233 -194
- data/lib/origami/dictionary.rb +253 -232
- data/lib/origami/encryption.rb +1274 -1243
- data/lib/origami/export.rb +232 -268
- data/lib/origami/extensions/fdf.rb +307 -220
- data/lib/origami/extensions/ppklite.rb +368 -435
- data/lib/origami/filespec.rb +197 -0
- data/lib/origami/filters.rb +301 -295
- data/lib/origami/filters/ascii.rb +177 -180
- data/lib/origami/filters/ccitt.rb +528 -535
- data/lib/origami/filters/crypt.rb +26 -35
- data/lib/origami/filters/dct.rb +46 -52
- data/lib/origami/filters/flate.rb +95 -94
- data/lib/origami/filters/jbig2.rb +49 -55
- data/lib/origami/filters/jpx.rb +38 -44
- data/lib/origami/filters/lzw.rb +189 -183
- data/lib/origami/filters/predictors.rb +221 -235
- data/lib/origami/filters/runlength.rb +103 -104
- data/lib/origami/font.rb +173 -186
- data/lib/origami/functions.rb +67 -81
- data/lib/origami/graphics.rb +25 -21
- data/lib/origami/graphics/colors.rb +178 -187
- data/lib/origami/graphics/instruction.rb +79 -85
- data/lib/origami/graphics/path.rb +142 -148
- data/lib/origami/graphics/patterns.rb +160 -167
- data/lib/origami/graphics/render.rb +43 -50
- data/lib/origami/graphics/state.rb +138 -153
- data/lib/origami/graphics/text.rb +188 -205
- data/lib/origami/graphics/xobject.rb +819 -815
- data/lib/origami/header.rb +63 -78
- data/lib/origami/javascript.rb +596 -597
- data/lib/origami/linearization.rb +285 -290
- data/lib/origami/metadata.rb +139 -148
- data/lib/origami/name.rb +112 -148
- data/lib/origami/null.rb +53 -62
- data/lib/origami/numeric.rb +162 -175
- data/lib/origami/obfuscation.rb +186 -174
- data/lib/origami/object.rb +593 -573
- data/lib/origami/outline.rb +42 -47
- data/lib/origami/outputintents.rb +73 -82
- data/lib/origami/page.rb +703 -592
- data/lib/origami/parser.rb +238 -290
- data/lib/origami/parsers/fdf.rb +41 -33
- data/lib/origami/parsers/pdf.rb +75 -95
- data/lib/origami/parsers/pdf/lazy.rb +137 -0
- data/lib/origami/parsers/pdf/linear.rb +64 -66
- data/lib/origami/parsers/ppklite.rb +34 -70
- data/lib/origami/pdf.rb +1030 -1005
- data/lib/origami/reference.rb +102 -102
- data/lib/origami/signature.rb +591 -609
- data/lib/origami/stream.rb +668 -551
- data/lib/origami/string.rb +397 -373
- data/lib/origami/template/patterns.rb +56 -0
- data/lib/origami/template/widgets.rb +151 -0
- data/lib/origami/trailer.rb +144 -158
- data/lib/origami/tree.rb +62 -0
- data/lib/origami/version.rb +23 -0
- data/lib/origami/webcapture.rb +88 -79
- data/lib/origami/xfa.rb +2863 -2882
- data/lib/origami/xreftable.rb +472 -384
- data/test/dataset/calc.pdf +85 -0
- data/test/dataset/crypto.pdf +82 -0
- data/test/dataset/empty.pdf +49 -0
- data/test/test_actions.rb +27 -0
- data/test/test_annotations.rb +90 -0
- data/test/test_pages.rb +31 -0
- data/test/test_pdf.rb +16 -0
- data/test/test_pdf_attachment.rb +34 -0
- data/test/test_pdf_create.rb +24 -0
- data/test/test_pdf_encrypt.rb +95 -0
- data/test/test_pdf_parse.rb +96 -0
- data/test/test_pdf_sign.rb +58 -0
- data/test/test_streams.rb +182 -0
- data/test/test_xrefs.rb +67 -0
- metadata +88 -58
- data/README +0 -67
- data/bin/pdf2graph +0 -121
- data/bin/pdfcocoon +0 -104
- data/lib/origami/file.rb +0 -233
- data/samples/README.txt +0 -45
- data/samples/actions/launch/calc.rb +0 -87
- data/samples/actions/launch/winparams.rb +0 -22
- data/samples/actions/loop/loopgoto.rb +0 -24
- data/samples/actions/loop/loopnamed.rb +0 -21
- data/samples/actions/named/named.rb +0 -31
- data/samples/actions/samba/smbrelay.rb +0 -26
- data/samples/actions/webbug/submitform.js +0 -26
- data/samples/actions/webbug/webbug-browser.rb +0 -68
- data/samples/actions/webbug/webbug-js.rb +0 -67
- data/samples/actions/webbug/webbug-reader.rb +0 -90
- data/samples/attachments/attach.rb +0 -40
- data/samples/attachments/attached.txt +0 -1
- data/samples/crypto/crypto.rb +0 -28
- data/samples/digsig/signed.rb +0 -46
- data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
- data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
- data/samples/exploits/exploit_customdictopen.rb +0 -55
- data/samples/exploits/getannots.rb +0 -69
- data/samples/flash/flash.rb +0 -31
- data/samples/javascript/attached.txt +0 -1
- data/samples/javascript/js.rb +0 -52
- data/templates/patterns.rb +0 -66
- data/templates/widgets.rb +0 -173
- data/templates/xdp.rb +0 -92
- data/test/ts_pdf.rb +0 -50
data/lib/origami/acroform.rb
CHANGED
@@ -1,321 +1,295 @@
|
|
1
1
|
=begin
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
-
GNU Lesser General Public License for more details.
|
20
|
-
|
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/>.
|
3
|
+
This file is part of Origami, PDF manipulation framework for Ruby
|
4
|
+
Copyright (C) 2016 Guillaume Delugré.
|
5
|
+
|
6
|
+
Origami is free software: you can redistribute it and/or modify
|
7
|
+
it under the terms of the GNU Lesser General Public License as published by
|
8
|
+
the Free Software Foundation, either version 3 of the License, or
|
9
|
+
(at your option) any later version.
|
10
|
+
|
11
|
+
Origami is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
GNU Lesser General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU Lesser General Public License
|
17
|
+
along with Origami. If not, see <http://www.gnu.org/licenses/>.
|
23
18
|
|
24
19
|
=end
|
25
20
|
|
26
21
|
module Origami
|
27
22
|
|
28
|
-
|
23
|
+
class PDF
|
29
24
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
25
|
+
#
|
26
|
+
# Returns true if the document contains an acrobat form.
|
27
|
+
#
|
28
|
+
def form?
|
29
|
+
(not self.Catalog.nil?) and self.Catalog.has_key? :AcroForm
|
30
|
+
end
|
36
31
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
32
|
+
#
|
33
|
+
# Creates a new AcroForm with specified fields.
|
34
|
+
#
|
35
|
+
def create_form(*fields)
|
36
|
+
acroform = self.Catalog.AcroForm ||= InteractiveForm.new.set_indirect(true)
|
37
|
+
self.add_fields(*fields)
|
43
38
|
|
44
|
-
|
45
|
-
|
39
|
+
acroform
|
40
|
+
end
|
46
41
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
#
|
64
|
-
# Returns an array of Acroform fields.
|
65
|
-
#
|
66
|
-
def fields
|
67
|
-
if self.has_form?
|
68
|
-
if self.Catalog.AcroForm.has_key?(:Fields)
|
69
|
-
self.Catalog.AcroForm[:Fields].map {|field| field.solve}
|
42
|
+
#
|
43
|
+
# Add a field to the Acrobat form.
|
44
|
+
# _field_:: The Field to add.
|
45
|
+
#
|
46
|
+
def add_fields(*fields)
|
47
|
+
raise TypeError, "Expected Field arguments" unless fields.all? { |f| f.is_a?(Field) }
|
48
|
+
|
49
|
+
self.Catalog.AcroForm ||= InteractiveForm.new.set_indirect(true)
|
50
|
+
self.Catalog.AcroForm.Fields ||= []
|
51
|
+
|
52
|
+
self.Catalog.AcroForm.Fields.concat(fields)
|
53
|
+
fields.each do |field| field.set_indirect(true) end
|
54
|
+
|
55
|
+
self
|
70
56
|
end
|
71
|
-
end
|
72
|
-
end
|
73
57
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
58
|
+
#
|
59
|
+
# Returns an Array of Acroform fields.
|
60
|
+
#
|
61
|
+
def fields
|
62
|
+
self.each_field.to_a
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# Iterates over each Acroform Field.
|
67
|
+
#
|
68
|
+
def each_field
|
69
|
+
return enum_for(__method__) do
|
70
|
+
if self.form? and self.Catalog.AcroForm[:Fields].is_a?(Array)
|
71
|
+
self.Catalog.AcroForm[:Fields].length
|
72
|
+
else
|
73
|
+
0
|
74
|
+
end
|
75
|
+
end unless block_given?
|
76
|
+
|
77
|
+
if self.form? and self.Catalog.AcroForm[:Fields].is_a?(Array)
|
78
|
+
self.Catalog.AcroForm[:Fields].each do |field|
|
79
|
+
yield(field.solve)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# Returns the corresponding named Field.
|
86
|
+
#
|
87
|
+
def get_field(name)
|
88
|
+
self.each_field do |field|
|
89
|
+
return field if field[:T].solve == name
|
90
|
+
end
|
81
91
|
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
#
|
86
|
-
# Returns the corresponding named Field.
|
87
|
-
#
|
88
|
-
def get_field(name)
|
89
|
-
self.each_field do |field|
|
90
|
-
return field if field[:T].solve == name
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
#
|
96
|
-
# Class representing a interactive form Dictionary.
|
97
|
-
#
|
98
|
-
class InteractiveForm < Dictionary
|
99
|
-
|
100
|
-
include StandardObject
|
101
|
-
|
102
|
-
#
|
103
|
-
# Flags relative to signature fields.
|
104
|
-
#
|
105
|
-
module SigFlags
|
106
|
-
SIGNATURESEXIST = 1 << 0
|
107
|
-
APPENDONLY = 1 << 1
|
108
|
-
end
|
109
|
-
|
110
|
-
field :Fields, :Type => Array, :Required => true, :Default => []
|
111
|
-
field :NeedAppearances, :Type => Boolean, :Default => false
|
112
|
-
field :SigFlags, :Type => Integer, :Default => 0
|
113
|
-
field :CO, :Type => Array, :Version => "1.3"
|
114
|
-
field :DR, :Type => Dictionary
|
115
|
-
field :DA, :Type => String
|
116
|
-
field :Q, :Type => Integer
|
117
|
-
field :XFA, :Type => [ Stream, Array ]
|
118
|
-
|
119
|
-
end
|
120
|
-
|
121
|
-
module Field
|
122
|
-
|
123
|
-
#
|
124
|
-
# Types of fields.
|
125
|
-
#
|
126
|
-
module Type
|
127
|
-
BUTTON = :Btn
|
128
|
-
TEXT = :Tx
|
129
|
-
CHOICE = :Ch
|
130
|
-
SIGNATURE = :Sig
|
131
92
|
end
|
132
|
-
|
93
|
+
|
133
94
|
#
|
134
|
-
#
|
95
|
+
# Class representing a interactive form Dictionary.
|
135
96
|
#
|
136
|
-
|
137
|
-
|
138
|
-
REQUIRED = 1 << 1
|
139
|
-
NOEXPORT = 1 << 2
|
140
|
-
end
|
141
|
-
|
142
|
-
module TextAlign
|
143
|
-
LEFT = 0
|
144
|
-
CENTER = 1
|
145
|
-
RIGHT = 2
|
146
|
-
end
|
147
|
-
|
148
|
-
def self.included(receiver) #:nodoc:
|
149
|
-
|
150
|
-
receiver.field :FT, :Type => Name, :Required => true
|
151
|
-
receiver.field :Parent, :Type => Dictionary
|
152
|
-
receiver.field :Kids, :Type => Array
|
153
|
-
receiver.field :T, :Type => String
|
154
|
-
receiver.field :TU, :Type => String, :Version => "1.3"
|
155
|
-
receiver.field :TM, :Type => String, :Version => "1.3"
|
156
|
-
receiver.field :Ff, :Type => Integer, :Default => 0
|
157
|
-
receiver.field :V, :Type => Object
|
158
|
-
receiver.field :DV, :Type => Object
|
159
|
-
receiver.field :AA, :Type => Dictionary, :Version => "1.2"
|
160
|
-
|
161
|
-
# Variable text fields
|
162
|
-
receiver.field :DA, :Type => String, :Default => "/F1 10 Tf 0 g", :Required => true
|
163
|
-
receiver.field :Q, :Type => Integer, :Default => TextAlign::LEFT
|
164
|
-
receiver.field :DS, :Type => ByteString, :Version => "1.5"
|
165
|
-
receiver.field :RV, :Type => [ String, Stream ], :Version => "1.5"
|
166
|
-
|
167
|
-
end
|
168
|
-
|
169
|
-
def pre_build #:nodoc:
|
170
|
-
|
171
|
-
if not self.T
|
172
|
-
self.T = "undef#{::Array.new(5) {(0x30 + rand(10)).chr}.join}"
|
173
|
-
end
|
174
|
-
|
175
|
-
super
|
176
|
-
end
|
97
|
+
class InteractiveForm < Dictionary
|
98
|
+
include StandardObject
|
177
99
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
self.AA.K = action
|
186
|
-
|
187
|
-
end
|
100
|
+
#
|
101
|
+
# Flags relative to signature fields.
|
102
|
+
#
|
103
|
+
module SigFlags
|
104
|
+
SIGNATURESEXIST = 1 << 0
|
105
|
+
APPENDONLY = 1 << 1
|
106
|
+
end
|
188
107
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
108
|
+
field :Fields, :Type => Array, :Required => true, :Default => []
|
109
|
+
field :NeedAppearances, :Type => Boolean, :Default => false
|
110
|
+
field :SigFlags, :Type => Integer, :Default => 0
|
111
|
+
field :CO, :Type => Array, :Version => "1.3"
|
112
|
+
field :DR, :Type => Dictionary
|
113
|
+
field :DA, :Type => String
|
114
|
+
field :Q, :Type => Integer
|
115
|
+
field :XFA, :Type => [ XFAStream, Array.of(String, XFAStream) ]
|
198
116
|
end
|
199
117
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
118
|
+
module Field
|
119
|
+
#
|
120
|
+
# Types of fields.
|
121
|
+
#
|
122
|
+
module Type
|
123
|
+
BUTTON = :Btn
|
124
|
+
TEXT = :Tx
|
125
|
+
CHOICE = :Ch
|
126
|
+
SIGNATURE = :Sig
|
127
|
+
end
|
210
128
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
end
|
129
|
+
#
|
130
|
+
# Flags relative to fields.
|
131
|
+
#
|
132
|
+
module Flags
|
133
|
+
READONLY = 1 << 0
|
134
|
+
REQUIRED = 1 << 1
|
135
|
+
NOEXPORT = 1 << 2
|
136
|
+
end
|
221
137
|
|
222
|
-
|
223
|
-
|
224
|
-
|
138
|
+
module TextAlign
|
139
|
+
LEFT = 0
|
140
|
+
CENTER = 1
|
141
|
+
RIGHT = 2
|
142
|
+
end
|
225
143
|
|
226
|
-
|
227
|
-
|
228
|
-
self.Kids.concat(fields)
|
144
|
+
class AdditionalActions < Dictionary
|
145
|
+
include StandardObject
|
229
146
|
|
230
|
-
|
147
|
+
field :K, :Type => Dictionary, :Version => "1.3"
|
148
|
+
field :F, :Type => Dictionary, :Version => "1.3"
|
149
|
+
field :V, :Type => Dictionary, :Version => "1.3"
|
150
|
+
field :C, :Type => Dictionary, :Version => "1.3"
|
151
|
+
end
|
231
152
|
|
232
|
-
self
|
233
|
-
|
234
|
-
|
153
|
+
def self.included(receiver) #:nodoc:
|
154
|
+
receiver.field :FT, :Type => Name, :Required => true
|
155
|
+
receiver.field :Parent, :Type => Field
|
156
|
+
receiver.field :Kids, :Type => Array.of(Field)
|
157
|
+
receiver.field :T, :Type => String
|
158
|
+
receiver.field :TU, :Type => String, :Version => "1.3"
|
159
|
+
receiver.field :TM, :Type => String, :Version => "1.3"
|
160
|
+
receiver.field :Ff, :Type => Integer, :Default => 0
|
161
|
+
receiver.field :V, :Type => Object
|
162
|
+
receiver.field :DV, :Type => Object
|
163
|
+
receiver.field :AA, :Type => AdditionalActions, :Version => "1.2"
|
235
164
|
|
236
|
-
|
237
|
-
|
238
|
-
|
165
|
+
# Variable text fields
|
166
|
+
receiver.field :DA, :Type => String, :Default => "/F1 10 Tf 0 g", :Required => true
|
167
|
+
receiver.field :Q, :Type => Integer, :Default => TextAlign::LEFT
|
168
|
+
receiver.field :DS, :Type => String, :Version => "1.5"
|
169
|
+
receiver.field :RV, :Type => [ String, Stream ], :Version => "1.5"
|
170
|
+
end
|
239
171
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
172
|
+
def pre_build #:nodoc:
|
173
|
+
self.T ||= "undef#{::Array.new(5) {('0'.ord + rand(10)).chr}.join}"
|
174
|
+
|
175
|
+
super
|
176
|
+
end
|
177
|
+
|
178
|
+
def onKeyStroke(action)
|
179
|
+
unless action.is_a?(Action)
|
180
|
+
raise TypeError, "An Action object must be passed."
|
181
|
+
end
|
182
|
+
|
183
|
+
self.AA ||= AdditionalActions.new
|
184
|
+
self.AA.K = action
|
185
|
+
end
|
186
|
+
|
187
|
+
def onFormat(action)
|
188
|
+
unless action.is_a?(Action)
|
189
|
+
raise TypeError, "An Action object must be passed."
|
190
|
+
end
|
191
|
+
|
192
|
+
self.AA ||= AdditionalActions.new
|
193
|
+
self.AA.F = action
|
194
|
+
end
|
195
|
+
|
196
|
+
def onValidate(action)
|
197
|
+
unless action.is_a?(Action)
|
198
|
+
raise TypeError, "An Action object must be passed."
|
199
|
+
end
|
200
|
+
|
201
|
+
self.AA ||= AdditionalActions.new
|
202
|
+
self.AA.V = action
|
264
203
|
end
|
265
|
-
|
266
|
-
super
|
267
|
-
end
|
268
|
-
|
269
|
-
end
|
270
|
-
|
271
|
-
class SignatureSeedValue < Dictionary
|
272
|
-
|
273
|
-
include StandardObject
|
274
|
-
|
275
|
-
module Digest
|
276
|
-
SHA1 = :SHA1
|
277
|
-
SHA256 = :SHA256
|
278
|
-
SHA384 = :SHA384
|
279
|
-
SHA512 = :SHA512
|
280
|
-
RIPEMD160 = :RIPEMD160
|
281
|
-
end
|
282
|
-
|
283
|
-
field :Type, :Type => Name, :Default => :SV
|
284
|
-
field :Filter, :Type => Name
|
285
|
-
field :SubFilter, :Type => Array
|
286
|
-
field :DigestMethod, :Type => Array, :Default => Digest::SHA1, :Version => "1.7"
|
287
|
-
field :V, :Type => Real, :Default => 1.0
|
288
|
-
field :Cert, :Type => Dictionary
|
289
|
-
field :Reasons, :Type => Array
|
290
|
-
field :MDP, :Type => Dictionary, :Version => "1.6"
|
291
|
-
field :TimeStamp, :Type => Dictionary, :Version => "1.6"
|
292
|
-
field :LegalAttestation, :Type => Array, :Version => "1.6"
|
293
|
-
field :AddRevInfo, :Type => Boolean, :Default => false, :Version => "1.7"
|
294
|
-
field :Ff, :Type => Integer, :Default => 0
|
295
|
-
|
296
|
-
end
|
297
|
-
|
298
|
-
class CertificateSeedValue < Dictionary
|
299
|
-
|
300
|
-
include StandardObject
|
301
|
-
|
302
|
-
module URL
|
303
|
-
BROWSER = :Browser
|
304
|
-
ASSP = :ASSP
|
305
|
-
end
|
306
|
-
|
307
|
-
field :Type, :Type => Name, :Default => :SVCert
|
308
|
-
field :Subject, :Type => Array
|
309
|
-
field :SubjectDN, :Type => Array, :Version => "1.7"
|
310
|
-
field :KeyUsage, :Type => Array, :Version => "1.7"
|
311
|
-
field :Issuer, :Type => Array
|
312
|
-
field :OID, :Type => Array
|
313
|
-
field :URL, :Type => ByteString
|
314
|
-
field :URLType, :Type => Name, :Default => URL::BROWSER, :Version => "1.7"
|
315
|
-
field :Ff, :Type => Integer, :Default => 0
|
316
204
|
|
205
|
+
def onCalculate(action)
|
206
|
+
unless action.is_a?(Action)
|
207
|
+
raise TypeError, "An Action object must be passed."
|
208
|
+
end
|
209
|
+
|
210
|
+
self.AA ||= AdditionalActions.new
|
211
|
+
self.AA.C = action
|
212
|
+
end
|
213
|
+
|
214
|
+
class Subform < Dictionary
|
215
|
+
include StandardObject
|
216
|
+
include Field
|
217
|
+
|
218
|
+
def add_fields(*fields)
|
219
|
+
self.Kids ||= []
|
220
|
+
self.Kids.concat(fields)
|
221
|
+
|
222
|
+
fields.each { |field| field.Parent = self }
|
223
|
+
|
224
|
+
self
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
class SignatureLock < Dictionary
|
229
|
+
include StandardObject
|
230
|
+
|
231
|
+
module Actions
|
232
|
+
ALL = :All
|
233
|
+
INCLUDE = :Include
|
234
|
+
EXCLUDE = :Exclude
|
235
|
+
end
|
236
|
+
|
237
|
+
field :Type, :Type => Name, :Default => :SigFieldLock
|
238
|
+
field :Action, :Type => Name, :Required => true
|
239
|
+
field :Fields, :Type => Array
|
240
|
+
|
241
|
+
def pre_build
|
242
|
+
if self.Action and self.Action != Actions::ALL
|
243
|
+
self.Fields ||= []
|
244
|
+
end
|
245
|
+
|
246
|
+
super
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
class SignatureSeedValue < Dictionary
|
251
|
+
include StandardObject
|
252
|
+
|
253
|
+
module Digest
|
254
|
+
SHA1 = :SHA1
|
255
|
+
SHA256 = :SHA256
|
256
|
+
SHA384 = :SHA384
|
257
|
+
SHA512 = :SHA512
|
258
|
+
RIPEMD160 = :RIPEMD160
|
259
|
+
end
|
260
|
+
|
261
|
+
field :Type, :Type => Name, :Default => :SV
|
262
|
+
field :Filter, :Type => Name
|
263
|
+
field :SubFilter, :Type => Array
|
264
|
+
field :DigestMethod, :Type => Array, :Default => Digest::SHA1, :Version => "1.7"
|
265
|
+
field :V, :Type => Real, :Default => 1.0
|
266
|
+
field :Cert, :Type => Dictionary
|
267
|
+
field :Reasons, :Type => Array
|
268
|
+
field :MDP, :Type => Dictionary, :Version => "1.6"
|
269
|
+
field :TimeStamp, :Type => Dictionary, :Version => "1.6"
|
270
|
+
field :LegalAttestation, :Type => Array, :Version => "1.6"
|
271
|
+
field :AddRevInfo, :Type => Boolean, :Default => false, :Version => "1.7"
|
272
|
+
field :Ff, :Type => Integer, :Default => 0
|
273
|
+
end
|
274
|
+
|
275
|
+
class CertificateSeedValue < Dictionary
|
276
|
+
include StandardObject
|
277
|
+
|
278
|
+
module URL
|
279
|
+
BROWSER = :Browser
|
280
|
+
ASSP = :ASSP
|
281
|
+
end
|
282
|
+
|
283
|
+
field :Type, :Type => Name, :Default => :SVCert
|
284
|
+
field :Subject, :Type => Array
|
285
|
+
field :SubjectDN, :Type => Array, :Version => "1.7"
|
286
|
+
field :KeyUsage, :Type => Array, :Version => "1.7"
|
287
|
+
field :Issuer, :Type => Array
|
288
|
+
field :OID, :Type => Array
|
289
|
+
field :URL, :Type => String
|
290
|
+
field :URLType, :Type => Name, :Default => URL::BROWSER, :Version => "1.7"
|
291
|
+
field :Ff, :Type => Integer, :Default => 0
|
292
|
+
end
|
317
293
|
end
|
318
|
-
|
319
|
-
end
|
320
294
|
|
321
295
|
end
|