origami 1.2.7 → 2.0.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.
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