Class Origami::Adobe::AddressBook
In: sources/parser/adobe/addressbook.rb
sources/parser/adobe/header.rb
Parent: Object

Class representing an Adobe Reader certificate store.

Methods

Classes and Modules

Module Origami::Adobe::AddressBook::Descriptor
Class Origami::Adobe::AddressBook::AddressList
Class Origami::Adobe::AddressBook::Catalog
Class Origami::Adobe::AddressBook::Certificate
Class Origami::Adobe::AddressBook::Header
Class Origami::Adobe::AddressBook::PPK
Class Origami::Adobe::AddressBook::Revision
Class Origami::Adobe::AddressBook::User
Class Origami::Adobe::AddressBook::UserList

Constants

Size = rev.body.size + 1
Cert = OpenSSL::X509::Certificate.new(certfile).to_der
ID = self.Catalog.PPK.AddressBook.NextID
Trust = attributes
Viewable = viewable
Editable = editable
Size = @revisions.first.body.size + 1

Attributes

filename  [RW] 
header  [RW] 
revisions  [RW] 

Public Instance methods

[Source]

     # File sources/parser/adobe/addressbook.rb, line 108
108:       def <<(object)
109:         
110:         object.set_indirect(true)
111:         
112:         if object.no.zero?
113:         maxno = 1
114:           while get_object(maxno) do maxno = maxno.succ end
115:           
116:           object.generation = 0
117:           object.no = maxno
118:         end
119:         
120:         @revisions.first.body[object.reference] = object
121:         
122:         object.reference
123:       end
124:       
125:       def Catalog
126:         get_object(@trailer.Root)
127:       end
128:       
129:       def saveas(filename)
130:         
131:         bin = ""
132:         bin << @header.to_s
133: 
134:         lastno, brange = 0, 0
135:           
136:         xrefs = [ XRef.new(0, XRef::LASTFREE, XRef::FREE) ]
137:         xrefsection = XRef::Section.new
138:  
139:         @revisions.first.body.values.sort.each { |obj|
140:           if (obj.no - lastno).abs > 1
141:             xrefsection << XRef::Subsection.new(brange, xrefs)
142:             brange = obj.no
143:             xrefs.clear
144:           end
145:           
146:           xrefs << XRef.new(bin.size, obj.generation, XRef::USED)
147:           lastno = obj.no
148: 
149:           bin << obj.to_s
150:         }
151:         
152:         xrefsection << XRef::Subsection.new(brange, xrefs)
153:         
154:         @xreftable = xrefsection
155:         @trailer ||= Trailer.new
156:         @trailer.Size = rev.body.size + 1
157:         @trailer.startxref = bin.size
158: 
159:         bin << @xreftable.to_s
160:         bin << @trailer.to_s
161: 
162:         fd = File.open(filename, "w").binmode
163:           fd << bin 
164:         fd.close
165:         
166:         show_entries
167:       end
168:       
169:       #
170:       # Prints registered users in the address book
171:       #
172:       def show_users
173:         
174:         puts "----------"
175:         puts "Users list"
176:         puts "----------"
177:         
178:         @revisions.first.body.values.each { |obj| if obj.is_a?(User) then obj.show; puts end }
179:         
180:         nil
181:       end
182:       
183:       #
184:       # Prints registered certificates in the addressbook
185:       #
186:       def show_certs
187:         puts "-----------------"
188:         puts "Certificates list"
189:         puts "-----------------"
190:         
191:         @revisions.first.body.values.each { |obj| if obj.is_a?(Certificate) then obj.show; puts end }
192:         
193:         nil
194:       end
195:       
196:       #
197:       # Prints certificate with the specified id
198:       #
199:       def show_cert(id)
200:         certs = @revisions.first.body.values.find_all { |obj| obj.is_a?(Certificate) and obj.ID == id }
201:         
202:         certs.each { |cert| cert.show; puts }
203:         
204:         nil
205:       end
206:       
207:       #
208:       # Returns a Certificate dictionary corresponding to the specified id
209:       #
210:       def get_cert(id)
211:         
212:         @revisions.first.body.values.find { |obj| obj.is_a?(Certificate) and obj.ID == id }
213:         
214:       end
215:       
216:       def show_user(id)
217:         users = @revisions.first.body.values.find_all { |obj| obj.is_a?(User) and obj.ID == id }
218:         
219:         users.each { |user| cert.show; puts }
220:         
221:         nil
222:       end
223:       
224:       #
225:       # Prints users and certificates registered in the address book
226:       #
227:       def show_entries
228:         show_users
229:         show_certs
230:         
231:         puts "End of address book."
232:       end
233:       
234:       #
235:       # Add a certificate into the address book
236:       #
237:       def add_certificate(certfile, attributes, viewable = false, editable = false)
238:         
239:         cert = Certificate.new
240:         cert.Cert = OpenSSL::X509::Certificate.new(certfile).to_der
241:         cert.ID = self.Catalog.PPK.AddressBook.NextID
242:         self.Catalog.PPK.AddressBook.NextID += 1
243:         cert.Trust = attributes
244:         cert.Viewable = viewable
245:         cert.Editable = editable
246:         
247:         self.Catalog.PPK.AddressBook.Entries.push(self << cert)
248:         
249:         show_certs
250:       end
251:       
252:       alias to_s show_entries
253:       alias to_str show_entries
254:       
255:       class Catalog < Dictionary
256:         
257:         include Configurable
258: 
259:         field   :Type,      :Type => Name, :Default => :Catalog, :Required => true
260:         field   :PPK,       :Type => Dictionary, :Required => true
261:         
262:         def initialize(hash = {}) #:nodoc:
263:           super(hash, true)
264:         end
265:         
266:       end
267:       
268:       class PPK < Dictionary
269:         
270:         include Configurable
271: 
272:         field   :Type,        :Type => Name, :Default => :PPK, :Required => true
273:         field   :User,        :Type => Dictionary, :Required => true
274:         field   :AddressBook, :Type => Dictionary, :Required => true
275:         field   :V,           :Type => Integer, :Default => 0x10001, :Required => true
276:         
277:         def initialize(hash = {}) #:nodoc:
278:           super(hash, false)
279:         end
280:         
281:       end
282:       
283:       class UserList < Dictionary
284:         
285:         include Configurable
286: 
287:         field   :Type,        :Type => Name, :Default => :User, :Required => true
288:         
289:         def initialize(hash = {})
290:           super(hash, false)
291:         end
292:         
293:       end
294:       
295:       class AddressList < Dictionary
296:         
297:         include Configurable
298: 
299:         field   :Type,        :Type => Name, :Default => :AddressBook, :Required => true
300:         field   :NextID,      :Type => Integer
301:         field   :Entries,     :Type => Array, :Default => [], :Required => true
302:         
303:         def initialize(hash = {}) #:nodoc:
304:           super(hash, false)
305:         end
306:         
307:       end
308:       
309:       module Descriptor
310:         
311:         CERTIFICATE = 1
312:         USER = 2
313: 
314:         def self.included(receiver) #:nodoc:
315:           receiver.field    :ID,        :Type => Integer, :Required => true
316:           receiver.field    :ABEType,   :Type => Integer, :Default => Descriptor::CERTIFICATE, :Required => true
317:         end
318:         
319:         def initialize(hash = {}) #:nodoc:
320:           super(hash, true)
321:         end
322:         
323:       end
324:       
325:       class User < Dictionary
326:         
327:         include Configurable
328:         include Descriptor
329: 
330:         field   :ABEType,       :Type => Integer, :Default => Descriptor::USER, :Required => true
331:         field   :Name,          :Type => String, :Required => true
332:         field   :Encrypt,       :Type => Integer
333:         field   :Certs,         :Type => Array, :Default => [], :Required => true
334:         
335:         def show
336:           puts "ID: #{self.ID}"
337:           puts "Name: #{self.Name}"
338:           puts "Certificates: " + self.Certs.join(", ")
339:         end
340:         
341:       end
342:       
343:       class Certificate < Dictionary
344:         
345:         include Configurable
346:         include Descriptor
347:         
348:         module Flags
349:           
350:           CAN_CERTIFY = 1 << 1
351:           ALLOW_DYNAMIC_CONTENT = 1 << 2
352:           UNKNOWN_1 = 1 << 3
353:           ALLOW_HIGH_PRIV_JS = 1 << 4
354:           UNKNOWN_2 = 1 << 5
355:           IS_ROOT_CA = 1 << 6
356:           
357:           #~ FULL_TRUST = 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 5 | 1 << 6
358:           FULL_TRUST = 8190
359:         end
360: 
361:         field   :ABEType,       :Type => Integer, :Default => Descriptor::CERTIFICATE, :Required => true
362:         field   :Usage,         :Type => Integer, :Default => 1, :Required => true
363:         field   :Viewable,      :Type => Boolean, :Default => true
364:         field   :Editable,      :Type => Boolean, :Default => true
365:         field   :Cert,          :Type => String, :Required => true
366:         field   :Trust,         :Type => Integer, :Default => Flags::UNKNOWN_2, :Required => true
367:         
368:         def show
369:           puts "ID: #{self.ID}"
370:           puts "Viewable: #{self.Viewable}"
371:           puts "Editable: #{self.Editable}"
372:           puts "Trust attributes: #{self.Trust}"
373:         end
374:         
375:       end
376:        
377:       def get_object(no, generation = 0) #:nodoc:
378:          
379:         case no
380:         when Reference
381:           target = no
382:         when ::Integer
383:           target = Reference.new(no, generation)
384:         when Origami::Object
385:           return no
386:         end
387:        
388:         @revisions.first.body[target]
389:       end
390:       
391:       private
392:       
393:       def rebuildxrefs #:nodoc:
394:         
395:         startxref = @header.to_s.size
396:         
397:         @revisions.first.body.values.each { |object|
398:           startxref += object.to_s.size
399:         }
400:           
401:         @xreftable = buildxrefs(@revisions.first.body)
402:         
403:         @trailer ||= Trailer.new
404:         @trailer.Size = @revisions.first.body.size + 1
405:         @trailer.startxref = startxref
406:         
407:         self
408:       end
409:       
410:       def buildxrefs(objects) #:nodoc:
411:         
412:         lastno = 0
413:         brange = 0
414:         
415:         xrefs = [ XRef.new(0, XRef::LASTFREE, XRef::FREE) ]
416:         
417:         xrefsection = XRef::Section.new
418:         objects.sort.each { |object|
419:           if (object.no - lastno).abs > 1
420:             xrefsection << XRef::Subsection.new(brange, xrefs)
421:             brange = object.no
422:             xrefs.clear
423:           end
424:           
425:           xrefs << XRef.new(get_object_offset(object.no, object.generation), object.generation, XRef::USED)
426: 
427:           lastno = object.no
428:         }
429:         
430:         xrefsection << XRef::Subsection.new(brange, xrefs)
431:         
432:         xrefsection
433:       end
434:      
435:       def get_object_offset(no,generation) #:nodoc:
436: 
437:         bodyoffset = @header.to_s.size
438:         
439:         objectoffset = bodyoffset
440:           
441:         @revisions.first.body.values.each { |object|
442:           if object.no == no and object.generation == generation then return objectoffset
443:           else
444:             objectoffset += object.to_s.size
445:           end
446:         }
447:         
448:         nil
449:       end
450:       
451:     end

[Source]

     # File sources/parser/adobe/addressbook.rb, line 125
125:       def Catalog
126:         get_object(@trailer.Root)
127:       end

Add a certificate into the address book

[Source]

     # File sources/parser/adobe/addressbook.rb, line 237
237:       def add_certificate(certfile, attributes, viewable = false, editable = false)
238:         
239:         cert = Certificate.new
240:         cert.Cert = OpenSSL::X509::Certificate.new(certfile).to_der
241:         cert.ID = self.Catalog.PPK.AddressBook.NextID
242:         self.Catalog.PPK.AddressBook.NextID += 1
243:         cert.Trust = attributes
244:         cert.Viewable = viewable
245:         cert.Editable = editable
246:         
247:         self.Catalog.PPK.AddressBook.Entries.push(self << cert)
248:         
249:         show_certs
250:       end

[Source]

    # File sources/parser/adobe/addressbook.rb, line 84
84:         def append_subobj(root, objset)
85:           
86:           if objset.find{ |o| o.object_id == root.object_id }.nil?
87:             
88:             objset << root
89:             
90:             if root.is_a?(Array) or root.is_a?(Dictionary)
91:               root.each { |subobj| append_subobj(subobj, objset) unless subobj.is_a?(Reference) }
92:             end
93:           
94:           end
95:           
96:         end

Returns a Certificate dictionary corresponding to the specified id

[Source]

     # File sources/parser/adobe/addressbook.rb, line 210
210:       def get_cert(id)
211:         
212:         @revisions.first.body.values.find { |obj| obj.is_a?(Certificate) and obj.ID == id }
213:         
214:       end

[Source]

     # File sources/parser/adobe/addressbook.rb, line 82
 82:       def objects
 83:         
 84:         def append_subobj(root, objset)
 85:           
 86:           if objset.find{ |o| o.object_id == root.object_id }.nil?
 87:             
 88:             objset << root
 89:             
 90:             if root.is_a?(Array) or root.is_a?(Dictionary)
 91:               root.each { |subobj| append_subobj(subobj, objset) unless subobj.is_a?(Reference) }
 92:             end
 93:           
 94:           end
 95:           
 96:         end
 97:         
 98:         objset = []
 99:         @revisions.first.body.values.each { |object|
100:           unless object.is_a?(Reference)
101:             append_subobj(object, objset)
102:           end
103:         }
104:         
105:         objset
106:       end

[Source]

     # File sources/parser/adobe/addressbook.rb, line 129
129:       def saveas(filename)
130:         
131:         bin = ""
132:         bin << @header.to_s
133: 
134:         lastno, brange = 0, 0
135:           
136:         xrefs = [ XRef.new(0, XRef::LASTFREE, XRef::FREE) ]
137:         xrefsection = XRef::Section.new
138:  
139:         @revisions.first.body.values.sort.each { |obj|
140:           if (obj.no - lastno).abs > 1
141:             xrefsection << XRef::Subsection.new(brange, xrefs)
142:             brange = obj.no
143:             xrefs.clear
144:           end
145:           
146:           xrefs << XRef.new(bin.size, obj.generation, XRef::USED)
147:           lastno = obj.no
148: 
149:           bin << obj.to_s
150:         }
151:         
152:         xrefsection << XRef::Subsection.new(brange, xrefs)
153:         
154:         @xreftable = xrefsection
155:         @trailer ||= Trailer.new
156:         @trailer.Size = rev.body.size + 1
157:         @trailer.startxref = bin.size
158: 
159:         bin << @xreftable.to_s
160:         bin << @trailer.to_s
161: 
162:         fd = File.open(filename, "w").binmode
163:           fd << bin 
164:         fd.close
165:         
166:         show_entries
167:       end

Prints certificate with the specified id

[Source]

     # File sources/parser/adobe/addressbook.rb, line 199
199:       def show_cert(id)
200:         certs = @revisions.first.body.values.find_all { |obj| obj.is_a?(Certificate) and obj.ID == id }
201:         
202:         certs.each { |cert| cert.show; puts }
203:         
204:         nil
205:       end

Prints registered certificates in the addressbook

[Source]

     # File sources/parser/adobe/addressbook.rb, line 186
186:       def show_certs
187:         puts "-----------------"
188:         puts "Certificates list"
189:         puts "-----------------"
190:         
191:         @revisions.first.body.values.each { |obj| if obj.is_a?(Certificate) then obj.show; puts end }
192:         
193:         nil
194:       end

Prints users and certificates registered in the address book

[Source]

     # File sources/parser/adobe/addressbook.rb, line 227
227:       def show_entries
228:         show_users
229:         show_certs
230:         
231:         puts "End of address book."
232:       end

[Source]

     # File sources/parser/adobe/addressbook.rb, line 216
216:       def show_user(id)
217:         users = @revisions.first.body.values.find_all { |obj| obj.is_a?(User) and obj.ID == id }
218:         
219:         users.each { |user| cert.show; puts }
220:         
221:         nil
222:       end

Prints registered users in the address book

[Source]

     # File sources/parser/adobe/addressbook.rb, line 172
172:       def show_users
173:         
174:         puts "----------"
175:         puts "Users list"
176:         puts "----------"
177:         
178:         @revisions.first.body.values.each { |obj| if obj.is_a?(User) then obj.show; puts end }
179:         
180:         nil
181:       end
to_s()

Alias for show_entries

to_str()

Alias for show_entries

[Validate]