Module: Rex::FileUtils

Defined in:
lib/rex/file.rb

Overview

This class provides helper methods for dealing with files that are not supplied by the standard ruby API.

Class Method Summary collapse

Class Method Details

.clean_path(old) ⇒ Object

This method cleans the supplied path of directory traversal sequences It must accept path/with/..a/folder../starting/or/ending/in/two/dots but clean ../something as well as path/with/..traversal


68
69
70
71
72
73
74
75
76
# File 'lib/rex/file.rb', line 68

def self.clean_path(old)
  path = old
  while(path.index(/\/..\/|\/..\\|\\..\\|\\..\/|\A..\\|\A..\//) != nil)
    path.gsub!(/\A..\\|\A..\//,'') #eliminate starting ..\ or ../
    path.gsub!(/\/..\/|\/..\\/,'/') #clean linux style
    path.gsub!(/\\..\\|\\..\//,'\\') #clean windows style
  end
  path
end

.find_full_path(file_name) ⇒ Object

This method searches the PATH environment variable for a fully qualified path to the supplied file name.


82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/rex/file.rb', line 82

def self.find_full_path(file_name)

  # Check for the absolute fast first
  if (file_name[0,1] == "/" and ::File.exists?(file_name) and ::File::Stat.new(file_name))
    return file_name
  end

  path = Rex::Compat.getenv('PATH')
  if (path)
    path.split(::File::PATH_SEPARATOR).each { |base|
      begin
        # Deal with Windows paths surrounded by quotes.  Prevents
        # silliness like trying to look for
        # '"C:\\framework\\nmap"\\nmap.exe' which will always fail.
        base = $1 if base =~ /^"(.*)"$/
        path = base + ::File::SEPARATOR + file_name
        if (::File::Stat.new(path) and not ::File.directory?(path))
          return path
        end
      rescue
      end
    }
  end
  return nil
end

.normalize_unix_path(*strs) ⇒ Object

This method joins the paths together in Unix format.


19
20
21
22
23
24
# File 'lib/rex/file.rb', line 19

def self.normalize_unix_path(*strs)
  new_str = strs * '/'
  new_str = new_str.gsub!("//", "/") while new_str.index("//")

  new_str
end

.normalize_win_path(*strs) ⇒ Object

This method joins the paths together in Windows format. All reserved characters will be filtered out, including:

" * : < > ? \ / |

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/rex/file.rb', line 31

def self.normalize_win_path(*strs)
  # Convert to the same format so the parsing is easier
  s = strs * '\\'

  # Filter out double slashes
  s = s.gsub(/\\\\/, '\\') while s.index('\\\\')

  # Keep the trailing slash if exists
  trailing_s = ('\\' if s =~ /\\$/) || ''

  # Check the items (fie/dir) individually
  s = s.split(/\\/)

  # Parse the path prefix
  prefix = (s[0] || '').gsub(/[\*<>\?\/]/, '')

  # Delete the original prefix. We want the new one later.
  s.delete_at(0)

  # Filter out all the reserved characters
  s.map! {|e| e.gsub(/["\*:<>\?\\\/|]/, '') }

  # Put the modified prefix back
  s.insert(0, prefix)

  # And then safely join the items
  s *= '\\'

  # Add the trailing slash back if exists
  s << trailing_s
end