origami 1.2.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,321 +1,295 @@
1
1
  =begin
2
2
 
3
- = File
4
- acroform.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
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.
15
-
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.
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
- class PDF
23
+ class PDF
29
24
 
30
- #
31
- # Returns true if the document contains an acrobat form.
32
- #
33
- def has_form?
34
- (not self.Catalog.nil?) and self.Catalog.has_key? :AcroForm
35
- end
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
- # Creates a new AcroForm with specified fields.
39
- #
40
- def create_acroform(*fields)
41
- acroform = self.Catalog.AcroForm ||= InteractiveForm.new.set_indirect(true)
42
- self.add_fields(*fields)
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
- acroform
45
- end
39
+ acroform
40
+ end
46
41
 
47
- #
48
- # Add a field to the Acrobat form.
49
- # _field_:: The Field to add.
50
- #
51
- def add_fields(*fields)
52
- raise TypeError, "Expected Field arguments" unless fields.all? { |f| f.is_a?(Field) }
53
-
54
- self.Catalog.AcroForm ||= InteractiveForm.new.set_indirect(true)
55
- self.Catalog.AcroForm.Fields ||= []
56
-
57
- self.Catalog.AcroForm.Fields.concat(fields)
58
- fields.each do |field| field.set_indirect(true) end
59
-
60
- self
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
- # Iterates over each Acroform Field.
76
- #
77
- def each_field(&b)
78
- if self.has_form?
79
- if self.Catalog.AcroForm.has_key?(:Fields)
80
- self.Catalog.AcroForm[:Fields].each {|field| b.call(field.solve)}
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
- # Flags relative to fields.
95
+ # Class representing a interactive form Dictionary.
135
96
  #
136
- module Flags
137
- READONLY = 1 << 0
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
- def onKeyStroke(action)
179
-
180
- unless action.is_a?(Action)
181
- raise TypeError, "An Action object must be passed."
182
- end
183
-
184
- self.AA ||= AdditionalActions.new
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
- def onFormat(action)
190
-
191
- unless action.is_a?(Action)
192
- raise TypeError, "An Action object must be passed."
193
- end
194
-
195
- self.AA ||= AdditionalActions.new
196
- self.AA.F = action
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
- def onValidate(action)
201
-
202
- unless action.is_a?(Action)
203
- raise TypeError, "An Action object must be passed."
204
- end
205
-
206
- self.AA ||= AdditionalActions.new
207
- self.AA.V = action
208
-
209
- end
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
- def onCalculate(action)
212
-
213
- unless action.is_a?(Action)
214
- raise TypeError, "An Action object must be passed."
215
- end
216
-
217
- self.AA ||= AdditionalActions.new
218
- self.AA.C = action
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
- class Subform < Dictionary
223
- include StandardObject
224
- include Field
138
+ module TextAlign
139
+ LEFT = 0
140
+ CENTER = 1
141
+ RIGHT = 2
142
+ end
225
143
 
226
- def add_fields(*fields)
227
- self.Kids ||= []
228
- self.Kids.concat(fields)
144
+ class AdditionalActions < Dictionary
145
+ include StandardObject
229
146
 
230
- fields.each do |field| field.Parent = self end
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
- end
234
- end
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
- class AdditionalActions < Dictionary
237
-
238
- include StandardObject
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
- field :K, :Type => Dictionary, :Version => "1.3"
241
- field :F, :Type => Dictionary, :Version => "1.3"
242
- field :V, :Type => Dictionary, :Version => "1.3"
243
- field :C, :Type => Dictionary, :Version => "1.3"
244
- end
245
-
246
- class SignatureLock < Dictionary
247
-
248
- include StandardObject
249
-
250
- module Actions
251
- ALL = :All
252
- INCLUDE = :Include
253
- EXCLUDE = :Exclude
254
- end
255
-
256
- field :Type, :Type => Name, :Default => :SigFieldLock
257
- field :Action, :Type => Name, :Required => true
258
- field :Fields, :Type => Array
259
-
260
- def pre_build
261
-
262
- if self.Action and self.Action != Actions::ALL
263
- self.Fields ||= []
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