class SafeFile

Public Class Methods

basename(file_name, suffix = :none) click to toggle source
# File lib/ndr_support/safe_file.rb, line 93
def self.basename(file_name, suffix = :none)
  verify file_name
  if suffix == :none
    File.basename(file_name)
  else
    File.basename(file_name, suffix)
  end
end
basename_file() click to toggle source
# File lib/ndr_support/safe_file.rb, line 107
def self.basename_file
  # SECURE: 02-08-2012 TPG Can't assign to __FILE__
  File.basename(__FILE__)
end
delete(*list) click to toggle source
# File lib/ndr_support/safe_file.rb, line 119
def self.delete(*list)
  verify list, 'w'

  list.each do |file|
    File.delete(file) if File.exist?(file)
  end.length
end
directory?(file_name) click to toggle source
# File lib/ndr_support/safe_file.rb, line 69
def self.directory?(file_name)
  verify file_name
  File.directory?(file_name)
end
dirname(path) click to toggle source
# File lib/ndr_support/safe_file.rb, line 112
def self.dirname(path)
  verify path
  res = path.clone
  res.path = File.dirname(path)
  res
end
exist?(file_name) click to toggle source
# File lib/ndr_support/safe_file.rb, line 74
def self.exist?(file_name)
  self.exists?(file_name)
end
exists?(file_name) click to toggle source
# File lib/ndr_support/safe_file.rb, line 78
def self.exists?(file_name)
  verify file_name
  File.exist?(file_name)
end
extname(file_name) click to toggle source
# File lib/ndr_support/safe_file.rb, line 53
def self.extname(file_name)
  verify file_name
  File.extname(file_name)
end
file?(file_name) click to toggle source
# File lib/ndr_support/safe_file.rb, line 83
def self.file?(file_name)
  verify file_name
  File.file?(file_name)
end
get_fname_mode_prms(*args) click to toggle source
# File lib/ndr_support/safe_file.rb, line 157
def self.get_fname_mode_prms(*args)
  case args.length
  when 1
    verify_mode(args[0], 'r')
    fname = args[0]
    mode = 'r'
    prms = nil

  when 2
    fail ArgumentError unless args[1].is_a?(Integer) || args[1].is_a?(String)

    if args[1].is_a?(Integer)
      verify_mode(args[0], 'r')
      mode = 'r'
      prms = args[1]
    else
      verify_mode(args[0], args[1])
      mode = args[1]
      prms = nil
    end

    fname = args[0]

  when 3
    fail ArgumentError unless args[1].is_a?(String) && args[2].is_a?(Integer)
    verify_mode(args[0], args[1])

    fname = args[0]
    mode = args[1]
    prms = args[2]
  else
    fail ArgumentError, "Incorrect number of arguments #{args.length}"
  end

  [fname, mode, prms]
end
new(*args) click to toggle source
# File lib/ndr_support/safe_file.rb, line 4
def initialize(*args)
  a = self.class.get_fname_mode_prms(*args)
  fname = a[0]
  mode = a[1]
  prms = a[2]

  if prms
    @file = File.new(fname, mode, prms)
  else
    @file = File.new(fname, mode)
  end

  # Just in case better clone the object
  # Ruby object are passed by reference
  @file_name = fname.clone
end
open(*args) { |f| ... } click to toggle source
# File lib/ndr_support/safe_file.rb, line 21
def self.open(*args)
  return SafeFile.new(*args) unless block_given?

  f = SafeFile.new(*args)
  yield f
  f.close
end
read(file_name) click to toggle source
# File lib/ndr_support/safe_file.rb, line 58
def self.read(file_name)
  verify file_name, 'r'
  File.read(file_name)
end
readlines(*args) click to toggle source
# File lib/ndr_support/safe_file.rb, line 63
def self.readlines(*args)
  fail ArgumentError, "Incorrect number of arguments - #{args.length}" if args.length > 2 or args.length == 0
  verify args[0], 'r'
  File.readlines(*args)
end
safepath_to_string(fname) click to toggle source
# File lib/ndr_support/safe_file.rb, line 102
def self.safepath_to_string(fname)
  verify fname
  fname.to_s
end
verify(file_names, prm = nil) click to toggle source
# File lib/ndr_support/safe_file.rb, line 133
def self.verify(file_names, prm = nil)
  [file_names].flatten.each do |file_name|
    fail ArgumentError, "file_name should be of type SafePath, but it is #{file_name.class}" unless file_name.class == SafePath

    if prm
      [prm].flatten.each do |p|
        fail SecurityError, "Permissions denied. Cannot access the file #{file_name} with permissions #{prm}. The permissions are #{file_name.permissions}" unless file_name.permissions.include?(p)
      end
    end
  end
end
verify_mode(file_name, mode) click to toggle source
# File lib/ndr_support/safe_file.rb, line 145
def self.verify_mode(file_name, mode)
  if mode.match(/\A(r\+)|(w\+)|(a\+)\Z/)
    verify file_name, ['w', 'r']
  elsif mode.match(/\Aw|a\Z/)
    verify file_name, ['w']
  elsif mode.match(/\Ar\Z/)
    verify file_name, ['r']
  else
    fail ArgumentError, "Incorrect mode. It should be one of: 'r', 'w', 'r+', 'w+', 'a', 'a+'"
  end
end
zero?(file_name) click to toggle source
# File lib/ndr_support/safe_file.rb, line 88
def self.zero?(file_name)
  verify file_name
  File.zero?(file_name)
end

Public Instance Methods

close() click to toggle source
# File lib/ndr_support/safe_file.rb, line 29
def close
  @file.close
end
each(*args, &block) click to toggle source
# File lib/ndr_support/safe_file.rb, line 43
def each(*args, &block)
  verify @file_name, 'r'
  @file.each(*args, &block)
end
Also aliased as: each_line
each_line(*args, &block)
Alias for: each
path() click to toggle source
# File lib/ndr_support/safe_file.rb, line 49
def path
  @file_name.clone
end
read() click to toggle source
# File lib/ndr_support/safe_file.rb, line 33
def read
  verify @file_name, 'r'
  @file.read
end
write(data) click to toggle source
# File lib/ndr_support/safe_file.rb, line 38
def write(data)
  verify @file_name, 'w'
  @file.write(data)
end

Private Instance Methods

verify(file_names, prm = nil) click to toggle source
# File lib/ndr_support/safe_file.rb, line 129
def verify(file_names, prm = nil)
  self.class.verify(file_names, prm)
end