Class: SafeFile

Inherits:
Object
  • Object
show all
Defined in:
lib/ndr_support/safe_file.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ SafeFile

Returns a new instance of SafeFile.



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/ndr_support/safe_file.rb', line 2

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

Class Method Details

.basename(file_name, suffix = :none) ⇒ Object



91
92
93
94
95
96
97
98
# File 'lib/ndr_support/safe_file.rb', line 91

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_fileObject



105
106
107
108
# File 'lib/ndr_support/safe_file.rb', line 105

def self.basename_file
  # SECURE: 02-08-2012 TPG Can't assign to __FILE__
  File.basename(__FILE__)
end

.delete(*list) ⇒ Object



117
118
119
120
121
122
123
# File 'lib/ndr_support/safe_file.rb', line 117

def self.delete(*list)
  verify list, 'w'

  list.each do |file|
    File.delete(file) if File.exist?(file)
  end.length
end

.directory?(file_name) ⇒ Boolean

Returns:

  • (Boolean)


67
68
69
70
# File 'lib/ndr_support/safe_file.rb', line 67

def self.directory?(file_name)
  verify file_name
  File.directory?(file_name)
end

.dirname(path) ⇒ Object



110
111
112
113
114
115
# File 'lib/ndr_support/safe_file.rb', line 110

def self.dirname(path)
  verify path
  res = path.clone
  res.path = File.dirname(path)
  res
end

.exist?(file_name) ⇒ Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/ndr_support/safe_file.rb', line 72

def self.exist?(file_name)
  self.exists?(file_name)
end

.exists?(file_name) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
79
# File 'lib/ndr_support/safe_file.rb', line 76

def self.exists?(file_name)
  verify file_name
  File.exist?(file_name)
end

.extname(file_name) ⇒ Object



51
52
53
54
# File 'lib/ndr_support/safe_file.rb', line 51

def self.extname(file_name)
  verify file_name
  File.extname(file_name)
end

.file?(file_name) ⇒ Boolean

Returns:

  • (Boolean)


81
82
83
84
# File 'lib/ndr_support/safe_file.rb', line 81

def self.file?(file_name)
  verify file_name
  File.file?(file_name)
end

.get_fname_mode_prms(*args) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/ndr_support/safe_file.rb', line 155

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 if args[1].class != Fixnum and args[1].class != String

    if args[1].class == Fixnum
      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 if args[1].class != String or args[2].class != Fixnum
    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

.open(*args) {|f| ... } ⇒ Object

Yields:

  • (f)


19
20
21
22
23
24
25
# File 'lib/ndr_support/safe_file.rb', line 19

def self.open(*args)
  return SafeFile.new(*args) unless block_given?

  f = SafeFile.new(*args)
  yield f
  f.close
end

.read(file_name) ⇒ Object



56
57
58
59
# File 'lib/ndr_support/safe_file.rb', line 56

def self.read(file_name)
  verify file_name, 'r'
  File.read(file_name)
end

.readlines(*args) ⇒ Object



61
62
63
64
65
# File 'lib/ndr_support/safe_file.rb', line 61

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) ⇒ Object



100
101
102
103
# File 'lib/ndr_support/safe_file.rb', line 100

def self.safepath_to_string(fname)
  verify fname
  fname.to_s
end

.verify(file_names, prm = nil) ⇒ Object



131
132
133
134
135
136
137
138
139
140
141
# File 'lib/ndr_support/safe_file.rb', line 131

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) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
# File 'lib/ndr_support/safe_file.rb', line 143

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) ⇒ Boolean

Returns:

  • (Boolean)


86
87
88
89
# File 'lib/ndr_support/safe_file.rb', line 86

def self.zero?(file_name)
  verify file_name
  File.zero?(file_name)
end

Instance Method Details

#closeObject



27
28
29
# File 'lib/ndr_support/safe_file.rb', line 27

def close
  @file.close
end

#each(*args, &block) ⇒ Object Also known as: each_line



41
42
43
44
# File 'lib/ndr_support/safe_file.rb', line 41

def each(*args, &block)
  verify @file_name, 'r'
  @file.each(*args, &block)
end

#pathObject



47
48
49
# File 'lib/ndr_support/safe_file.rb', line 47

def path
  @file_name.clone
end

#readObject



31
32
33
34
# File 'lib/ndr_support/safe_file.rb', line 31

def read
  verify @file_name, 'r'
  @file.read
end

#write(data) ⇒ Object



36
37
38
39
# File 'lib/ndr_support/safe_file.rb', line 36

def write(data)
  verify @file_name, 'w'
  @file.write(data)
end