Parent

Class/Module Index [+]

Quicksearch

Rex::Zip::Entry

An Entry represents a logical file or directory to be stored in an Archive

Attributes

attrs[RW]
comment[RW]
data[R]
flags[RW]
info[RW]
name[RW]
xtra[RW]

Public Class Methods

new(fname, data, compmeth, timestamp=nil, attrs=nil, xtra=nil, comment=nil) click to toggle source
# File lib/rex/zip/entry.rb, line 16
def initialize(fname, data, compmeth, timestamp=nil, attrs=nil, xtra=nil, comment=nil)
        @name = fname.unpack("C*").pack("C*")
        @data = data.unpack("C*").pack("C*")
        @xtra = xtra
        @xtra ||= ''
        @comment = comment
        @comment ||= ''
        @attrs = attrs
        @attrs ||= 0

        # XXX: sanitize timestmap (assume now)
        timestamp ||= Time.now
        @flags = CompFlags.new(0, compmeth, timestamp)

        if (@data)
                compress
        else
                @data = ''
                @info = CompInfo.new(0, 0, 0)
        end
        @compdata ||= ''
end

Public Instance Methods

compress() click to toggle source

Compress the data and store it for later use. If this entry's compression method produces a larger blob than the original data, the method is changed to CM_STORE.

# File lib/rex/zip/entry.rb, line 48
def compress
        @crc = Zlib.crc32(@data, 0)
        case @flags.compmeth

        when CM_STORE
                @compdata = @data

        when CM_DEFLATE
                z = Zlib::Deflate.new(Zlib::BEST_COMPRESSION)
                @compdata = z.deflate(@data, Zlib::FINISH)
                z.close
                @compdata = @compdata[2, @compdata.length-6]

        else
                raise 'Unsupported compression method: %u' % @flags.compmeth
        end

        # if compressing doesn't help, just store it
        if (@compdata.length > @data.length)
                @compdata = @data
                @flags.compmeth = CM_STORE
        end

        @info = CompInfo.new(@crc, @compdata.length, @data.length)
end
data=(val) click to toggle source
# File lib/rex/zip/entry.rb, line 39
def data=(val)
        @data = val.unpack("C*").pack("C*")
        compress
end
inspect() click to toggle source
# File lib/rex/zip/entry.rb, line 105
def inspect
        "#<#{self.class} name:#{name}, data:#{@data.length} bytes>"
end
pack() click to toggle source

Return the compressed data in a format suitable for adding to an Archive

# File lib/rex/zip/entry.rb, line 86
def pack
        #  - lfh 1
        lfh = LocalFileHdr.new(self)
        ret = lfh.pack

        #  - data 1
        if (@compdata)
                ret << @compdata
        end

        if (@gpbf & GPBF_USE_DATADESC)
                #  - data desc 1
                dd = DataDesc.new(@info)
                ret << dd.pack
        end

        ret
end
relative_path() click to toggle source
# File lib/rex/zip/entry.rb, line 75
def relative_path
        if (@name[0,1] == '/')
                return @name[1,@name.length]
        end
        @name
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.