module Rex::FileUtils

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

Public Class Methods

clean_path(old) click to toggle source

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

# File lib/rex/file.rb, line 67
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) click to toggle source

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

# File lib/rex/file.rb, line 81
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) click to toggle source

This method joins the paths together in Unix format.

# File lib/rex/file.rb, line 18
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) click to toggle source

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

" * : < > ? \ / |
# File lib/rex/file.rb, line 30
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