Class: Rex::Post::FileStat
- Inherits:
-
Object
- Object
- Rex::Post::FileStat
show all
- Defined in:
- lib/rex/post/file_stat.rb
Overview
This class emulates the ruby FileStat class against a remote entity in a generic fashion. Refer to the ruby documentation for expected behavior.
Constant Summary
collapse
- @@ftypes =
[
'fifo', 'characterSpecial', 'directory',
'blockSpecial', 'file', 'link', 'socket'
]
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
#initialize(buf = '') ⇒ FileStat
Returns a new instance of FileStat.
30
31
32
33
|
# File 'lib/rex/post/file_stat.rb', line 30
def initialize(buf='')
self.stathash = {}
update(buf) if (buf and not buf.empty?)
end
|
Instance Attribute Details
#stathash ⇒ Object
Returns the value of attribute stathash.
28
29
30
|
# File 'lib/rex/post/file_stat.rb', line 28
def stathash
@stathash
end
|
Instance Method Details
#atime ⇒ Object
65
66
67
|
# File 'lib/rex/post/file_stat.rb', line 65
def atime
::Time.at(self.stathash['st_atime'])
end
|
#blksize ⇒ Object
59
60
61
|
# File 'lib/rex/post/file_stat.rb', line 59
def blksize
self.stathash['st_blksize']
end
|
#blockdev? ⇒ Boolean
112
113
114
|
# File 'lib/rex/post/file_stat.rb', line 112
def blockdev?
filetype?(060000)
end
|
#blocks ⇒ Object
62
63
64
|
# File 'lib/rex/post/file_stat.rb', line 62
def blocks
self.stathash['st_blocks']
end
|
#chardev? ⇒ Boolean
115
116
117
|
# File 'lib/rex/post/file_stat.rb', line 115
def chardev?
filetype?(020000)
end
|
#ctime ⇒ Object
71
72
73
|
# File 'lib/rex/post/file_stat.rb', line 71
def ctime
::Time.at(self.stathash['st_ctime'])
end
|
#dev ⇒ Object
35
36
37
|
# File 'lib/rex/post/file_stat.rb', line 35
def dev
self.stathash['st_dev']
end
|
#directory? ⇒ Boolean
118
119
120
|
# File 'lib/rex/post/file_stat.rb', line 118
def directory?
filetype?(040000)
end
|
#executable? ⇒ Boolean
171
172
173
|
# File 'lib/rex/post/file_stat.rb', line 171
def executable?
raise NotImplementedError
end
|
#executable_real? ⇒ Boolean
174
175
176
|
# File 'lib/rex/post/file_stat.rb', line 174
def executable_real?
raise NotImplementedError
end
|
#file? ⇒ Boolean
121
122
123
|
# File 'lib/rex/post/file_stat.rb', line 121
def file?
filetype?(0100000)
end
|
#filetype?(mask) ⇒ Boolean
this is my own, just a helper…
107
108
109
110
|
# File 'lib/rex/post/file_stat.rb', line 107
def filetype?(mask)
return true if mode & 0170000 == mask
return false
end
|
#ftype ⇒ Object
134
135
136
|
# File 'lib/rex/post/file_stat.rb', line 134
def ftype
return @@ftypes[(mode & 0170000) >> 13].dup
end
|
#gid ⇒ Object
50
51
52
|
# File 'lib/rex/post/file_stat.rb', line 50
def gid
self.stathash['st_gid']
end
|
#grpowned? ⇒ Boolean
177
178
179
|
# File 'lib/rex/post/file_stat.rb', line 177
def grpowned?
raise NotImplementedError
end
|
#ino ⇒ Object
38
39
40
|
# File 'lib/rex/post/file_stat.rb', line 38
def ino
self.stathash['st_ino']
end
|
#mode ⇒ Object
41
42
43
|
# File 'lib/rex/post/file_stat.rb', line 41
def mode
self.stathash['st_mode']
end
|
#mtime ⇒ Object
68
69
70
|
# File 'lib/rex/post/file_stat.rb', line 68
def mtime
::Time.at(self.stathash['st_mtime'])
end
|
#nlink ⇒ Object
44
45
46
|
# File 'lib/rex/post/file_stat.rb', line 44
def nlink
self.stathash['st_nlink']
end
|
#owned? ⇒ Boolean
180
181
182
|
# File 'lib/rex/post/file_stat.rb', line 180
def owned?
raise NotImplementedError
end
|
#perm?(mask) ⇒ Boolean
S_ISUID 0004000 set UID bit S_ISGID 0002000 set GID bit (see below) S_ISVTX 0001000 sticky bit (see below) S_IRWXU 00700 mask for file owner permissions S_IRUSR 00400 owner has read permission S_IWUSR 00200 owner has write permission S_IXUSR 00100 owner has execute permission S_IRWXG 00070 mask for group permissions S_IRGRP 00040 group has read permission S_IWGRP 00020 group has write permission S_IXGRP 00010 group has execute permission S_IRWXO 00007 mask for permissions for others (not in group) S_IROTH 00004 others have read permission S_IWOTH 00002 others have write permission S_IXOTH 00001 others have execute permission
156
157
158
159
|
# File 'lib/rex/post/file_stat.rb', line 156
def perm?(mask)
return true if mode & mask == mask
return false
end
|
#pipe? ⇒ Boolean
124
125
126
|
# File 'lib/rex/post/file_stat.rb', line 124
def pipe?
filetype?(010000) end
|
#pretty ⇒ Object
Return pretty information about a file.
217
218
219
220
221
222
223
224
225
|
# File 'lib/rex/post/file_stat.rb', line 217
def pretty
" Size: #{size} Blocks: #{blocks} IO Block: #{blksize} Type: #{rdev}\n"\
"Device: #{dev} Inode: #{ino} Links: #{nlink}\n"\
" Mode: #{prettymode}\n"\
" Uid: #{uid} Gid: #{gid}\n"\
"Access: #{atime}\n"\
"Modify: #{mtime}\n"\
"Change: #{ctime}\n"
end
|
#prettymode ⇒ Object
Return pretty information about a file’s permissions.
199
200
201
202
203
204
205
206
207
208
209
210
211
212
|
# File 'lib/rex/post/file_stat.rb', line 199
def prettymode
m = mode
om = '%06o' % m
perms = ''
3.times {
perms = ((m & 01) == 01 ? 'x' : '-') + perms
perms = ((m & 02) == 02 ? 'w' : '-') + perms
perms = ((m & 04) == 04 ? 'r' : '-') + perms
m >>= 3
}
return "#{om}/#{perms}"
end
|
#rdev ⇒ Object
53
54
55
|
# File 'lib/rex/post/file_stat.rb', line 53
def rdev
self.stathash['st_rdev']
end
|
#readable? ⇒ Boolean
183
184
185
|
# File 'lib/rex/post/file_stat.rb', line 183
def readable?
raise NotImplementedError
end
|
#readable_real? ⇒ Boolean
186
187
188
|
# File 'lib/rex/post/file_stat.rb', line 186
def readable_real?
raise NotImplementedError
end
|
#setgid? ⇒ Boolean
161
162
163
|
# File 'lib/rex/post/file_stat.rb', line 161
def setgid?
perm?(02000)
end
|
#setuid? ⇒ Boolean
164
165
166
|
# File 'lib/rex/post/file_stat.rb', line 164
def setuid?
perm?(04000)
end
|
#size ⇒ Object
56
57
58
|
# File 'lib/rex/post/file_stat.rb', line 56
def size
self.stathash['st_size']
end
|
#socket? ⇒ Boolean
127
128
129
|
# File 'lib/rex/post/file_stat.rb', line 127
def socket?
filetype?(0140000)
end
|
#sticky? ⇒ Boolean
167
168
169
|
# File 'lib/rex/post/file_stat.rb', line 167
def sticky?
perm?(01000)
end
|
#symlink? ⇒ Boolean
130
131
132
|
# File 'lib/rex/post/file_stat.rb', line 130
def symlink?
filetype?(0120000)
end
|
#uid ⇒ Object
47
48
49
|
# File 'lib/rex/post/file_stat.rb', line 47
def uid
self.stathash['st_uid']
end
|
#update(buf) ⇒ Object
75
76
77
78
79
80
81
|
# File 'lib/rex/post/file_stat.rb', line 75
def update(buf)
skeys = %W{st_dev st_mode st_nlink st_uid st_gid st_rdev st_ino st_size st_atime st_mtime st_ctime}
svals = buf.unpack("VVVVVVQQQQQ")
skeys.each_index do |i|
self.stathash[ skeys[i] ] = svals[i]
end
end
|
#update32(buf) ⇒ Object
This handles the old 32bit st_size buf from old stageless meterpreters for backwards compatibility Maybe we can remove this in the future
87
88
89
90
91
92
93
|
# File 'lib/rex/post/file_stat.rb', line 87
def update32(buf)
skeys = %W{st_dev st_ino st_mode st_pad st_nlink st_uid st_gid st_rdev st_size st_ctime st_atime st_mtime}
svals = buf.unpack("VvvvvvvVVVVV")
skeys.each_index do |i|
self.stathash[ skeys[i] ] = svals[i]
end
end
|
#writeable? ⇒ Boolean
189
190
191
|
# File 'lib/rex/post/file_stat.rb', line 189
def writeable?
raise NotImplementedError
end
|
#writeable_real? ⇒ Boolean
192
193
194
|
# File 'lib/rex/post/file_stat.rb', line 192
def writeable_real?
raise NotImplementedError
end
|