Class: Rex::Zip::Entry

Inherits:
Object
  • Object
show all
Defined in:
lib/rex/zip/entry.rb

Overview

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(fname, data, compmeth, timestamp = nil, attrs = nil, xtra = nil, comment = nil) ⇒ Entry

Returns a new instance of Entry.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/rex/zip/entry.rb', line 17

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

Instance Attribute Details

#attrsObject

Returns the value of attribute attrs.



14
15
16
# File 'lib/rex/zip/entry.rb', line 14

def attrs
  @attrs
end

#commentObject

Returns the value of attribute comment.



14
15
16
# File 'lib/rex/zip/entry.rb', line 14

def comment
  @comment
end

#dataObject

Returns the value of attribute data.



15
16
17
# File 'lib/rex/zip/entry.rb', line 15

def data
  @data
end

#flagsObject

Returns the value of attribute flags.



14
15
16
# File 'lib/rex/zip/entry.rb', line 14

def flags
  @flags
end

#infoObject

Returns the value of attribute info.



14
15
16
# File 'lib/rex/zip/entry.rb', line 14

def info
  @info
end

#nameObject

Returns the value of attribute name.



14
15
16
# File 'lib/rex/zip/entry.rb', line 14

def name
  @name
end

#xtraObject

Returns the value of attribute xtra.



14
15
16
# File 'lib/rex/zip/entry.rb', line 14

def xtra
  @xtra
end

Instance Method Details

#compressObject

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.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/rex/zip/entry.rb', line 49

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

#inspectObject



106
107
108
# File 'lib/rex/zip/entry.rb', line 106

def inspect
  "#<#{self.class} name:#{name}, data:#{@data.length} bytes>"
end

#packObject

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



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/rex/zip/entry.rb', line 87

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_pathObject



76
77
78
79
80
81
# File 'lib/rex/zip/entry.rb', line 76

def relative_path
  if (@name[0,1] == '/')
    return @name[1,@name.length]
  end
  @name
end