origami 1.0.2
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.
- data/COPYING.LESSER +165 -0
 - data/README +77 -0
 - data/VERSION +1 -0
 - data/bin/config/pdfcop.conf.yml +237 -0
 - data/bin/gui/about.rb +46 -0
 - data/bin/gui/config.rb +132 -0
 - data/bin/gui/file.rb +385 -0
 - data/bin/gui/hexdump.rb +74 -0
 - data/bin/gui/hexview.rb +91 -0
 - data/bin/gui/imgview.rb +72 -0
 - data/bin/gui/menu.rb +392 -0
 - data/bin/gui/properties.rb +132 -0
 - data/bin/gui/signing.rb +635 -0
 - data/bin/gui/textview.rb +107 -0
 - data/bin/gui/treeview.rb +409 -0
 - data/bin/gui/walker.rb +282 -0
 - data/bin/gui/xrefs.rb +79 -0
 - data/bin/pdf2graph +121 -0
 - data/bin/pdf2ruby +353 -0
 - data/bin/pdfcocoon +104 -0
 - data/bin/pdfcop +455 -0
 - data/bin/pdfdecompress +104 -0
 - data/bin/pdfdecrypt +95 -0
 - data/bin/pdfencrypt +112 -0
 - data/bin/pdfextract +221 -0
 - data/bin/pdfmetadata +123 -0
 - data/bin/pdfsh +13 -0
 - data/bin/pdfwalker +7 -0
 - data/bin/shell/.irbrc +104 -0
 - data/bin/shell/console.rb +136 -0
 - data/bin/shell/hexdump.rb +83 -0
 - data/origami.rb +36 -0
 - data/origami/3d.rb +239 -0
 - data/origami/acroform.rb +321 -0
 - data/origami/actions.rb +299 -0
 - data/origami/adobe/fdf.rb +259 -0
 - data/origami/adobe/ppklite.rb +489 -0
 - data/origami/annotations.rb +775 -0
 - data/origami/array.rb +187 -0
 - data/origami/boolean.rb +101 -0
 - data/origami/catalog.rb +486 -0
 - data/origami/destinations.rb +213 -0
 - data/origami/dictionary.rb +188 -0
 - data/origami/docmdp.rb +96 -0
 - data/origami/encryption.rb +1293 -0
 - data/origami/export.rb +283 -0
 - data/origami/file.rb +222 -0
 - data/origami/filters.rb +250 -0
 - data/origami/filters/ascii.rb +189 -0
 - data/origami/filters/ccitt.rb +515 -0
 - data/origami/filters/crypt.rb +47 -0
 - data/origami/filters/dct.rb +61 -0
 - data/origami/filters/flate.rb +112 -0
 - data/origami/filters/jbig2.rb +63 -0
 - data/origami/filters/jpx.rb +53 -0
 - data/origami/filters/lzw.rb +195 -0
 - data/origami/filters/predictors.rb +276 -0
 - data/origami/filters/runlength.rb +117 -0
 - data/origami/font.rb +209 -0
 - data/origami/functions.rb +93 -0
 - data/origami/graphics.rb +33 -0
 - data/origami/graphics/colors.rb +191 -0
 - data/origami/graphics/instruction.rb +126 -0
 - data/origami/graphics/path.rb +154 -0
 - data/origami/graphics/patterns.rb +180 -0
 - data/origami/graphics/state.rb +164 -0
 - data/origami/graphics/text.rb +224 -0
 - data/origami/graphics/xobject.rb +493 -0
 - data/origami/header.rb +90 -0
 - data/origami/linearization.rb +318 -0
 - data/origami/metadata.rb +114 -0
 - data/origami/name.rb +170 -0
 - data/origami/null.rb +75 -0
 - data/origami/numeric.rb +188 -0
 - data/origami/obfuscation.rb +233 -0
 - data/origami/object.rb +527 -0
 - data/origami/outline.rb +59 -0
 - data/origami/page.rb +559 -0
 - data/origami/parser.rb +268 -0
 - data/origami/parsers/fdf.rb +45 -0
 - data/origami/parsers/pdf.rb +27 -0
 - data/origami/parsers/pdf/linear.rb +113 -0
 - data/origami/parsers/ppklite.rb +86 -0
 - data/origami/pdf.rb +1144 -0
 - data/origami/reference.rb +113 -0
 - data/origami/signature.rb +474 -0
 - data/origami/stream.rb +575 -0
 - data/origami/string.rb +416 -0
 - data/origami/trailer.rb +173 -0
 - data/origami/webcapture.rb +87 -0
 - data/origami/xfa.rb +3027 -0
 - data/origami/xreftable.rb +447 -0
 - data/templates/patterns.rb +66 -0
 - data/templates/widgets.rb +173 -0
 - data/templates/xdp.rb +92 -0
 - data/tests/dataset/test.dummycrt +28 -0
 - data/tests/dataset/test.dummykey +27 -0
 - data/tests/tc_actions.rb +32 -0
 - data/tests/tc_annotations.rb +85 -0
 - data/tests/tc_pages.rb +37 -0
 - data/tests/tc_pdfattach.rb +24 -0
 - data/tests/tc_pdfencrypt.rb +110 -0
 - data/tests/tc_pdfnew.rb +32 -0
 - data/tests/tc_pdfparse.rb +98 -0
 - data/tests/tc_pdfsig.rb +37 -0
 - data/tests/tc_streams.rb +129 -0
 - data/tests/ts_pdf.rb +45 -0
 - metadata +193 -0
 
    
        data/bin/pdfmetadata
    ADDED
    
    | 
         @@ -0,0 +1,123 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            = Author: 
         
     | 
| 
      
 6 
     | 
    
         
            +
              Guillaume Delugré <guillaume/at/security-labs.org>
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            = Info:
         
     | 
| 
      
 9 
     | 
    
         
            +
              Prints out the metadata contained in a PDF document.
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            = License:
         
     | 
| 
      
 12 
     | 
    
         
            +
            	Origami is free software: you can redistribute it and/or modify
         
     | 
| 
      
 13 
     | 
    
         
            +
              it under the terms of the GNU Lesser General Public License as published by
         
     | 
| 
      
 14 
     | 
    
         
            +
              the Free Software Foundation, either version 3 of the License, or
         
     | 
| 
      
 15 
     | 
    
         
            +
              (at your option) any later version.
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              Origami is distributed in the hope that it will be useful,
         
     | 
| 
      
 18 
     | 
    
         
            +
              but WITHOUT ANY WARRANTY; without even the implied warranty of
         
     | 
| 
      
 19 
     | 
    
         
            +
              MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
         
     | 
| 
      
 20 
     | 
    
         
            +
              GNU Lesser General Public License for more details.
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              You should have received a copy of the GNU Lesser General Public License
         
     | 
| 
      
 23 
     | 
    
         
            +
              along with Origami.  If not, see <http://www.gnu.org/licenses/>.
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            =end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            begin
         
     | 
| 
      
 28 
     | 
    
         
            +
              require 'origami'
         
     | 
| 
      
 29 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 30 
     | 
    
         
            +
              ORIGAMIDIR = "#{File.dirname(__FILE__)}/.."
         
     | 
| 
      
 31 
     | 
    
         
            +
              $: << ORIGAMIDIR
         
     | 
| 
      
 32 
     | 
    
         
            +
              require 'origami'
         
     | 
| 
      
 33 
     | 
    
         
            +
            end
         
     | 
| 
      
 34 
     | 
    
         
            +
            include Origami
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            class OptParser
         
     | 
| 
      
 39 
     | 
    
         
            +
              BANNER = <<USAGE
         
     | 
| 
      
 40 
     | 
    
         
            +
            Usage: #{$0} [<PDF-file>] [-i] [-x]
         
     | 
| 
      
 41 
     | 
    
         
            +
            Prints out the metadata contained in a PDF document.
         
     | 
| 
      
 42 
     | 
    
         
            +
            Bug reports or feature requests at: http://origami-pdf.googlecode.com/
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            Options:
         
     | 
| 
      
 45 
     | 
    
         
            +
            USAGE
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
              def self.parser(options)
         
     | 
| 
      
 48 
     | 
    
         
            +
                OptionParser.new do |opts|
         
     | 
| 
      
 49 
     | 
    
         
            +
                  opts.banner = BANNER
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  opts.on("-i", "Extracts document info metadata") do |i|
         
     | 
| 
      
 52 
     | 
    
         
            +
                    options[:doc_info] = true
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  opts.on("-x", "Extracts XMP document metadata stream") do |i|
         
     | 
| 
      
 56 
     | 
    
         
            +
                    options[:doc_stream] = true
         
     | 
| 
      
 57 
     | 
    
         
            +
                  end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                  opts.on_tail("-h", "--help", "Show this message") do
         
     | 
| 
      
 60 
     | 
    
         
            +
                    puts opts
         
     | 
| 
      
 61 
     | 
    
         
            +
                    exit
         
     | 
| 
      
 62 
     | 
    
         
            +
                  end
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              def self.parse(args)
         
     | 
| 
      
 67 
     | 
    
         
            +
                options = 
         
     | 
| 
      
 68 
     | 
    
         
            +
                {
         
     | 
| 
      
 69 
     | 
    
         
            +
                  :output => STDOUT,
         
     | 
| 
      
 70 
     | 
    
         
            +
                }
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                self.parser(options).parse!(args)
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                options
         
     | 
| 
      
 75 
     | 
    
         
            +
              end
         
     | 
| 
      
 76 
     | 
    
         
            +
            end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
            begin
         
     | 
| 
      
 79 
     | 
    
         
            +
              @options = OptParser.parse(ARGV)
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
              unless @options[:doc_info] or @options[:doc_stream]
         
     | 
| 
      
 82 
     | 
    
         
            +
                @options[:doc_info] = @options[:doc_stream] = true
         
     | 
| 
      
 83 
     | 
    
         
            +
              end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
              target = (ARGV.empty?) ? STDIN : ARGV.shift
         
     | 
| 
      
 86 
     | 
    
         
            +
              params = 
         
     | 
| 
      
 87 
     | 
    
         
            +
              {
         
     | 
| 
      
 88 
     | 
    
         
            +
                :verbosity => Parser::VERBOSE_QUIET,
         
     | 
| 
      
 89 
     | 
    
         
            +
              }
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
              pdf = PDF.read(target, params)
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
              if @options[:doc_info]
         
     | 
| 
      
 94 
     | 
    
         
            +
                if pdf.has_document_info?
         
     | 
| 
      
 95 
     | 
    
         
            +
                  colorprint "[*] Document information dictionary:\n", Colors::MAGENTA
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                  docinfo = pdf.get_document_info
         
     | 
| 
      
 98 
     | 
    
         
            +
                  docinfo.each_pair do |name, item|
         
     | 
| 
      
 99 
     | 
    
         
            +
                    colorprint name.value.to_s.ljust(20, ' '), Colors::GREEN
         
     | 
| 
      
 100 
     | 
    
         
            +
                    puts ": #{item.solve.value}"
         
     | 
| 
      
 101 
     | 
    
         
            +
                  end
         
     | 
| 
      
 102 
     | 
    
         
            +
                  puts
         
     | 
| 
      
 103 
     | 
    
         
            +
                end
         
     | 
| 
      
 104 
     | 
    
         
            +
              end
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
              if @options[:doc_stream]
         
     | 
| 
      
 107 
     | 
    
         
            +
                if pdf.has_metadata?
         
     | 
| 
      
 108 
     | 
    
         
            +
                  colorprint "[*] Metadata stream:\n", Colors::MAGENTA
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                  metadata = pdf.get_metadata
         
     | 
| 
      
 111 
     | 
    
         
            +
                  metadata.each_pair do |name, item|
         
     | 
| 
      
 112 
     | 
    
         
            +
                    colorprint name.ljust(20, ' '), Colors::GREEN
         
     | 
| 
      
 113 
     | 
    
         
            +
                    puts ": #{item}"
         
     | 
| 
      
 114 
     | 
    
         
            +
                  end
         
     | 
| 
      
 115 
     | 
    
         
            +
                end
         
     | 
| 
      
 116 
     | 
    
         
            +
              end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
            rescue SystemExit
         
     | 
| 
      
 119 
     | 
    
         
            +
            rescue Exception => e
         
     | 
| 
      
 120 
     | 
    
         
            +
              STDERR.puts "#{e.class}: #{e.message}"
         
     | 
| 
      
 121 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 122 
     | 
    
         
            +
            end
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
    
        data/bin/pdfsh
    ADDED
    
    | 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            begin
         
     | 
| 
      
 4 
     | 
    
         
            +
              require 'irb'
         
     | 
| 
      
 5 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 6 
     | 
    
         
            +
              abort "Error: you need to install irb to run this application."
         
     | 
| 
      
 7 
     | 
    
         
            +
            end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            $:.unshift "#{File.dirname(__FILE__)}/shell"
         
     | 
| 
      
 10 
     | 
    
         
            +
            ENV["IRBRC"] = "#{File.dirname(__FILE__)}/shell/.irbrc"
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            IRB.start
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
    
        data/bin/pdfwalker
    ADDED
    
    
    
        data/bin/shell/.irbrc
    ADDED
    
    | 
         @@ -0,0 +1,104 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            begin
         
     | 
| 
      
 2 
     | 
    
         
            +
              require 'origami'
         
     | 
| 
      
 3 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 4 
     | 
    
         
            +
              ORIGAMIDIR = "#{File.dirname(__FILE__)}/../.."
         
     | 
| 
      
 5 
     | 
    
         
            +
              $: << ORIGAMIDIR
         
     | 
| 
      
 6 
     | 
    
         
            +
              require 'origami'
         
     | 
| 
      
 7 
     | 
    
         
            +
            end
         
     | 
| 
      
 8 
     | 
    
         
            +
            include Origami
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            require 'console.rb'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'readline'
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            DEFAULT_BANNER = "Welcome to the PDF shell (Origami release #{Origami::VERSION})\n\n"
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            def set_completion
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              completionProc = proc { |input|
         
     | 
| 
      
 18 
     | 
    
         
            +
                bind = IRB.conf[:MAIN_CONTEXT].workspace.binding
         
     | 
| 
      
 19 
     | 
    
         
            +
                
         
     | 
| 
      
 20 
     | 
    
         
            +
                validClasses = Origami.constants.reject do |name| 
         
     | 
| 
      
 21 
     | 
    
         
            +
                  obj = Origami.const_get(name)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  (not obj.is_a?(Module) and not obj.is_a?(Class)) or obj <= Exception
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                case input
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            #    # Classes
         
     | 
| 
      
 28 
     | 
    
         
            +
            #    when /^([A-Z][^:\.\(]*)$/
         
     | 
| 
      
 29 
     | 
    
         
            +
            #      classname = $1
         
     | 
| 
      
 30 
     | 
    
         
            +
            #      candidates = validClasses
         
     | 
| 
      
 31 
     | 
    
         
            +
            #      return candidates.grep(/^#{classname}/)
         
     | 
| 
      
 32 
     | 
    
         
            +
            #
         
     | 
| 
      
 33 
     | 
    
         
            +
            #    # Methods
         
     | 
| 
      
 34 
     | 
    
         
            +
            #    when /^([^:.\(]*)\.([^:.]*)$/
         
     | 
| 
      
 35 
     | 
    
         
            +
            #      classname = $1
         
     | 
| 
      
 36 
     | 
    
         
            +
            #      method = Regexp.quote($2)
         
     | 
| 
      
 37 
     | 
    
         
            +
            #      candidates = []
         
     | 
| 
      
 38 
     | 
    
         
            +
            #      if validClasses.include? $1
         
     | 
| 
      
 39 
     | 
    
         
            +
            #        begin
         
     | 
| 
      
 40 
     | 
    
         
            +
            #          candidates = eval("Origami::#{classname}.methods", bind)
         
     | 
| 
      
 41 
     | 
    
         
            +
            #        rescue Exception
         
     | 
| 
      
 42 
     | 
    
         
            +
            #          candidates = []
         
     | 
| 
      
 43 
     | 
    
         
            +
            #        end
         
     | 
| 
      
 44 
     | 
    
         
            +
            #        return candidates.grep(/^#{method}/).collect{|e| classname + "." + e}
         
     | 
| 
      
 45 
     | 
    
         
            +
            #      else
         
     | 
| 
      
 46 
     | 
    
         
            +
            #        begin
         
     | 
| 
      
 47 
     | 
    
         
            +
            #          var = $1.dup
         
     | 
| 
      
 48 
     | 
    
         
            +
            #          classname = eval("#{classname}.class", bind).to_s
         
     | 
| 
      
 49 
     | 
    
         
            +
            #          if validClasses.include?(classname.split("::").last)
         
     | 
| 
      
 50 
     | 
    
         
            +
            #            candidates = eval("#{classname}.public_instance_methods", bind)
         
     | 
| 
      
 51 
     | 
    
         
            +
            #          end
         
     | 
| 
      
 52 
     | 
    
         
            +
            #        rescue Exception => e
         
     | 
| 
      
 53 
     | 
    
         
            +
            #          candidates = []
         
     | 
| 
      
 54 
     | 
    
         
            +
            #        end
         
     | 
| 
      
 55 
     | 
    
         
            +
            #        return candidates.grep(/^#{method}/).collect{|e| var + "." + e}
         
     | 
| 
      
 56 
     | 
    
         
            +
            #      end
         
     | 
| 
      
 57 
     | 
    
         
            +
            #
         
     | 
| 
      
 58 
     | 
    
         
            +
                  # Mod/class
         
     | 
| 
      
 59 
     | 
    
         
            +
                  when /^(.*)::$/
         
     | 
| 
      
 60 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 61 
     | 
    
         
            +
                      space = eval("Origami::#{$1}", bind)
         
     | 
| 
      
 62 
     | 
    
         
            +
                    rescue Exception
         
     | 
| 
      
 63 
     | 
    
         
            +
                      return []
         
     | 
| 
      
 64 
     | 
    
         
            +
                    end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                    return space.constants.reject{|const| space.const_get(const) <= Exception}
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                  when /^(.*).$/
         
     | 
| 
      
 69 
     | 
    
         
            +
                    begin 
         
     | 
| 
      
 70 
     | 
    
         
            +
                      space = eval($1, bind)
         
     | 
| 
      
 71 
     | 
    
         
            +
                    rescue
         
     | 
| 
      
 72 
     | 
    
         
            +
                      return []
         
     | 
| 
      
 73 
     | 
    
         
            +
                    end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                    return space.public_methods
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
              }
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
              if Readline.respond_to?("basic_word_break_characters=")
         
     | 
| 
      
 80 
     | 
    
         
            +
                Readline.basic_word_break_characters= " \t\n\"\\'`><=;|&{("
         
     | 
| 
      
 81 
     | 
    
         
            +
              end
         
     | 
| 
      
 82 
     | 
    
         
            +
              Readline.completion_append_character = nil
         
     | 
| 
      
 83 
     | 
    
         
            +
              Readline.completion_proc = completionProc
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
            end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
            def set_prompt
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
              IRB.conf[:PROMPT][:PDFSH] = {
         
     | 
| 
      
 90 
     | 
    
         
            +
                :PROMPT_C => "?>> ",
         
     | 
| 
      
 91 
     | 
    
         
            +
                :RETURN => "%s\n",
         
     | 
| 
      
 92 
     | 
    
         
            +
                :PROMPT_I => ">>> ",
         
     | 
| 
      
 93 
     | 
    
         
            +
                :PROMPT_N => ">>> ",
         
     | 
| 
      
 94 
     | 
    
         
            +
                :PROMPT_S => nil
         
     | 
| 
      
 95 
     | 
    
         
            +
              }
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
              IRB.conf[:PROMPT_MODE] = :PDFSH
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            end
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
            Origami.colorprint(DEFAULT_BANNER, Origami::Colors::GREEN)
         
     | 
| 
      
 102 
     | 
    
         
            +
            #set_completion
         
     | 
| 
      
 103 
     | 
    
         
            +
            set_prompt
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,136 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            = File
         
     | 
| 
      
 4 
     | 
    
         
            +
            	console.rb
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            = Info
         
     | 
| 
      
 7 
     | 
    
         
            +
            	This file is part of Origami, PDF manipulation framework for Ruby
         
     | 
| 
      
 8 
     | 
    
         
            +
            	Copyright (C) 2010	Guillaume Delugré <guillaume@security-labs.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/>.
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            =end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            require 'hexdump'
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            if RUBY_VERSION < '1.9'
         
     | 
| 
      
 29 
     | 
    
         
            +
              def Kernel.spawn(cmd)
         
     | 
| 
      
 30 
     | 
    
         
            +
                fork do
         
     | 
| 
      
 31 
     | 
    
         
            +
                  exec(cmd)
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            module Origami
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              module Object
         
     | 
| 
      
 39 
     | 
    
         
            +
                def inspect
         
     | 
| 
      
 40 
     | 
    
         
            +
                  to_s
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
              end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              unless (RUBY_VERSION < '1.9' and RUBY_PLATFORM =~ /win32/)
         
     | 
| 
      
 45 
     | 
    
         
            +
                require 'tempfile'
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                class Stream
         
     | 
| 
      
 48 
     | 
    
         
            +
                  def edit(editor = 'vim')
         
     | 
| 
      
 49 
     | 
    
         
            +
                    tmpfile = Tempfile.new("origami")
         
     | 
| 
      
 50 
     | 
    
         
            +
                    tmpfile.write(self.data)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    tmpfile.close
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                    Process.wait Kernel.spawn "#{editor} #{tmpfile.path}"
         
     | 
| 
      
 54 
     | 
    
         
            +
                    
         
     | 
| 
      
 55 
     | 
    
         
            +
                    self.data = File.read(tmpfile.path)
         
     | 
| 
      
 56 
     | 
    
         
            +
                    tmpfile.unlink
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                    true
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                  def inspect
         
     | 
| 
      
 62 
     | 
    
         
            +
                    self.data.hexdump
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                class Page
         
     | 
| 
      
 67 
     | 
    
         
            +
                  def edit 
         
     | 
| 
      
 68 
     | 
    
         
            +
                    self.Contents.edit
         
     | 
| 
      
 69 
     | 
    
         
            +
                  end
         
     | 
| 
      
 70 
     | 
    
         
            +
                end
         
     | 
| 
      
 71 
     | 
    
         
            +
              end
         
     | 
| 
      
 72 
     | 
    
         
            +
              
         
     | 
| 
      
 73 
     | 
    
         
            +
              class PDF
         
     | 
| 
      
 74 
     | 
    
         
            +
                 
         
     | 
| 
      
 75 
     | 
    
         
            +
                 class Revision
         
     | 
| 
      
 76 
     | 
    
         
            +
                  def to_s
         
     | 
| 
      
 77 
     | 
    
         
            +
                    colorprint("----------  Body  ----------\n", Colors::WHITE, true)
         
     | 
| 
      
 78 
     | 
    
         
            +
                    @body.each_value { |obj|
         
     | 
| 
      
 79 
     | 
    
         
            +
                      colorprint("#{obj.reference.to_s.rjust(8,' ')}".ljust(10), Colors::MAGENTA)
         
     | 
| 
      
 80 
     | 
    
         
            +
                      colorprint("#{obj.type}\n", Colors::YELLOW)
         
     | 
| 
      
 81 
     | 
    
         
            +
                    }
         
     | 
| 
      
 82 
     | 
    
         
            +
                    #colorprint("---------- Xrefs -----------\n", Colors::BRIGHT_WHITE, true)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    #set_fg_color(Colors::BLUE, true) {
         
     | 
| 
      
 84 
     | 
    
         
            +
                    #  if not @xreftable
         
     | 
| 
      
 85 
     | 
    
         
            +
                    #    puts "  [x] No xref table found."
         
     | 
| 
      
 86 
     | 
    
         
            +
                    #  else
         
     | 
| 
      
 87 
     | 
    
         
            +
                    #    @xreftable.to_s.each_line { |line|
         
     | 
| 
      
 88 
     | 
    
         
            +
                    #      puts "  " + line
         
     | 
| 
      
 89 
     | 
    
         
            +
                    #    }
         
     | 
| 
      
 90 
     | 
    
         
            +
                    #  end
         
     | 
| 
      
 91 
     | 
    
         
            +
                    #}
         
     | 
| 
      
 92 
     | 
    
         
            +
                    colorprint("---------- Trailer ---------\n", Colors::WHITE, true) 
         
     | 
| 
      
 93 
     | 
    
         
            +
                    if not @trailer.dictionary
         
     | 
| 
      
 94 
     | 
    
         
            +
                      set_fg_color(Colors::BLUE, true) {
         
     | 
| 
      
 95 
     | 
    
         
            +
                        puts "  [x] No trailer found."
         
     | 
| 
      
 96 
     | 
    
         
            +
                      }
         
     | 
| 
      
 97 
     | 
    
         
            +
                    else
         
     | 
| 
      
 98 
     | 
    
         
            +
                      @trailer.dictionary.each_pair { |entry, value|
         
     | 
| 
      
 99 
     | 
    
         
            +
                        colorprint("  [*] ", Colors::MAGENTA)
         
     | 
| 
      
 100 
     | 
    
         
            +
                        colorprint("#{entry.to_s}: ", Colors::YELLOW)
         
     | 
| 
      
 101 
     | 
    
         
            +
                        colorprint("#{value.to_s}\n", Colors::RED)
         
     | 
| 
      
 102 
     | 
    
         
            +
                      }
         
     | 
| 
      
 103 
     | 
    
         
            +
                      colorprint("  [+] ", Colors::MAGENTA)
         
     | 
| 
      
 104 
     | 
    
         
            +
                      colorprint("startxref: ", Colors::YELLOW)
         
     | 
| 
      
 105 
     | 
    
         
            +
                      colorprint("#{@trailer.startxref}\n", Colors::RED)
         
     | 
| 
      
 106 
     | 
    
         
            +
                    end
         
     | 
| 
      
 107 
     | 
    
         
            +
                  end
         
     | 
| 
      
 108 
     | 
    
         
            +
                  
         
     | 
| 
      
 109 
     | 
    
         
            +
                  def inspect
         
     | 
| 
      
 110 
     | 
    
         
            +
                    to_s
         
     | 
| 
      
 111 
     | 
    
         
            +
                  end
         
     | 
| 
      
 112 
     | 
    
         
            +
                 end
         
     | 
| 
      
 113 
     | 
    
         
            +
                
         
     | 
| 
      
 114 
     | 
    
         
            +
                def to_s
         
     | 
| 
      
 115 
     | 
    
         
            +
                  puts
         
     | 
| 
      
 116 
     | 
    
         
            +
                  
         
     | 
| 
      
 117 
     | 
    
         
            +
                  colorprint("---------- Header ----------\n", Colors::WHITE, true)
         
     | 
| 
      
 118 
     | 
    
         
            +
                  colorprint("  [+] ", Colors::MAGENTA)
         
     | 
| 
      
 119 
     | 
    
         
            +
                  colorprint("Major version: ", Colors::YELLOW)
         
     | 
| 
      
 120 
     | 
    
         
            +
                  colorprint("#{@header.majorversion}\n", Colors::RED)
         
     | 
| 
      
 121 
     | 
    
         
            +
                  colorprint("  [+] ", Colors::MAGENTA)
         
     | 
| 
      
 122 
     | 
    
         
            +
                  colorprint("Minor version: ", Colors::YELLOW)
         
     | 
| 
      
 123 
     | 
    
         
            +
                  colorprint("#{@header.minorversion}\n", Colors::RED)
         
     | 
| 
      
 124 
     | 
    
         
            +
                  
         
     | 
| 
      
 125 
     | 
    
         
            +
                  @revisions.each { |revision|
         
     | 
| 
      
 126 
     | 
    
         
            +
                    revision.to_s
         
     | 
| 
      
 127 
     | 
    
         
            +
                  }
         
     | 
| 
      
 128 
     | 
    
         
            +
                  puts
         
     | 
| 
      
 129 
     | 
    
         
            +
                end
         
     | 
| 
      
 130 
     | 
    
         
            +
                
         
     | 
| 
      
 131 
     | 
    
         
            +
                def inspect
         
     | 
| 
      
 132 
     | 
    
         
            +
                  to_s
         
     | 
| 
      
 133 
     | 
    
         
            +
                end
         
     | 
| 
      
 134 
     | 
    
         
            +
              end
         
     | 
| 
      
 135 
     | 
    
         
            +
            end
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,83 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            = File
         
     | 
| 
      
 4 
     | 
    
         
            +
            	hexdump.rb
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            = Info
         
     | 
| 
      
 7 
     | 
    
         
            +
            	This file is part of Origami, PDF manipulation framework for Ruby
         
     | 
| 
      
 8 
     | 
    
         
            +
            	Copyright (C) 2009	Guillaume Delugr� <guillaume@security-labs.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 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 General Public License for more details.
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              You should have received a copy of the GNU General Public License
         
     | 
| 
      
 22 
     | 
    
         
            +
              along with Origami.  If not, see <http://www.gnu.org/licenses/>.
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            =end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            if RUBY_VERSION < '1.9'
         
     | 
| 
      
 27 
     | 
    
         
            +
              class Fixnum
         
     | 
| 
      
 28 
     | 
    
         
            +
                def ord; self; end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            class String #:nodoc:
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              def hexdump(bytesperline = 16, upcase = true, offsets = true, delta = 0)
         
     | 
| 
      
 35 
     | 
    
         
            +
                
         
     | 
| 
      
 36 
     | 
    
         
            +
                dump = ""
         
     | 
| 
      
 37 
     | 
    
         
            +
                counter = 0
         
     | 
| 
      
 38 
     | 
    
         
            +
                
         
     | 
| 
      
 39 
     | 
    
         
            +
                while counter < length
         
     | 
| 
      
 40 
     | 
    
         
            +
                  
         
     | 
| 
      
 41 
     | 
    
         
            +
                  offset = sprintf("%010X", counter + delta)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  
         
     | 
| 
      
 43 
     | 
    
         
            +
                  linelen = (counter < length - bytesperline) ? bytesperline : (length - counter)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  bytes = ""
         
     | 
| 
      
 45 
     | 
    
         
            +
                  linelen.times do |i|
         
     | 
| 
      
 46 
     | 
    
         
            +
                    
         
     | 
| 
      
 47 
     | 
    
         
            +
                    byte = self[counter + i].ord.to_s(base=16)
         
     | 
| 
      
 48 
     | 
    
         
            +
                    if byte.size < 2 then byte.insert(0, "0") end
         
     | 
| 
      
 49 
     | 
    
         
            +
                    bytes << byte
         
     | 
| 
      
 50 
     | 
    
         
            +
                    bytes << " " unless i == bytesperline - 1
         
     | 
| 
      
 51 
     | 
    
         
            +
                    
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  ascii = self[counter, linelen].ascii_print
         
     | 
| 
      
 55 
     | 
    
         
            +
                  
         
     | 
| 
      
 56 
     | 
    
         
            +
                  if upcase
         
     | 
| 
      
 57 
     | 
    
         
            +
                    offset.upcase!
         
     | 
| 
      
 58 
     | 
    
         
            +
                    bytes.upcase!
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
                  
         
     | 
| 
      
 61 
     | 
    
         
            +
                  if RUBY_PLATFORM =~ /win32/
         
     | 
| 
      
 62 
     | 
    
         
            +
                    dump << "#{offset if offsets}  #{bytes.to_s.ljust(bytesperline * 3 - 1)}  #{ascii}\n"
         
     | 
| 
      
 63 
     | 
    
         
            +
                  else
         
     | 
| 
      
 64 
     | 
    
         
            +
                    dump << "#{Origami.colorize(offset, Colors::YELLOW) if offsets}  #{Origami.colorize(bytes.to_s.ljust(bytesperline * 3 - 1), Colors::BRIGHT_GREY)}  #{ascii}\n"
         
     | 
| 
      
 65 
     | 
    
         
            +
                  end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                  counter += bytesperline
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                dump
         
     | 
| 
      
 71 
     | 
    
         
            +
              end
         
     | 
| 
      
 72 
     | 
    
         
            +
              
         
     | 
| 
      
 73 
     | 
    
         
            +
              def ascii_print
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                printable = ""
         
     | 
| 
      
 76 
     | 
    
         
            +
                self.each_byte { |c|
         
     | 
| 
      
 77 
     | 
    
         
            +
                  if c >= ' '[0].ord && c <= '~'[0].ord then printable << c else printable << '.' end
         
     | 
| 
      
 78 
     | 
    
         
            +
                }
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                return printable
         
     | 
| 
      
 81 
     | 
    
         
            +
              end
         
     | 
| 
      
 82 
     | 
    
         
            +
              
         
     | 
| 
      
 83 
     | 
    
         
            +
            end
         
     |