Class: FileYard

Inherits:
Object
  • Object
show all
Defined in:
app/models/file_yard.rb

Constant Summary collapse

SANE_FILE_NAME =
/[a-zA-Z0-9\-_\. ]{1,255}/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(files_path, max_upload_size) ⇒ FileYard

Returns a new instance of FileYard.



8
9
10
11
12
# File 'app/models/file_yard.rb', line 8

def initialize(files_path, max_upload_size)
  @files_path, @max_upload_size = files_path, max_upload_size
  FileUtils.mkdir_p(@files_path) unless File.exist?(@files_path)
  @files = Dir["#{@files_path}/*"].collect{|path| File.basename(path) if File.file?(path) }.compact
end

Instance Attribute Details

#files_pathObject (readonly)

Returns the value of attribute files_path.



6
7
8
# File 'app/models/file_yard.rb', line 6

def files_path
  @files_path
end

Instance Method Details

#check_upload_size(actual_upload_size) ⇒ Object



51
52
53
54
55
56
# File 'app/models/file_yard.rb', line 51

def check_upload_size(actual_upload_size)
  if actual_upload_size > @max_upload_size.kilobytes
    raise Instiki::ValidationError.new("Uploaded file size (#{actual_upload_size / 1024} " + 
            "kbytes) exceeds the maximum (#{@max_upload_size} kbytes) set for this wiki")
  end
end

#file_path(name) ⇒ Object



38
39
40
# File 'app/models/file_yard.rb', line 38

def file_path(name)
  "#{files_path}/#{name}"
end

#filesObject



30
31
32
# File 'app/models/file_yard.rb', line 30

def files
  Dir["#{files_path}/*"].collect{|path| File.basename(path) if File.file?(path)}.compact
end

#has_file?(name) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
# File 'app/models/file_yard.rb', line 34

def has_file?(name)
  files.include?(name)
end

#sanitize_file_name(name) ⇒ Object



44
45
46
47
48
49
# File 'app/models/file_yard.rb', line 44

def sanitize_file_name(name)
  unless name =~ SANE_FILE_NAME or name == '.' or name == '..'
    raise Instiki::ValidationError.new("Invalid file name: '#{name}'.\n" +
          "Only latin characters, digits, dots, underscores, dashes and spaces are accepted.")
  end
end

#upload_file(name, io) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'app/models/file_yard.rb', line 14

def upload_file(name, io)
  sanitize_file_name(name)
  if io.kind_of?(Tempfile)
    io.close
    check_upload_size(io.size)
    File.chmod(600, file_path(name)) if File.exists? file_path(name)
    FileUtils.mv(io.path, file_path(name))
  else
    content = io.read
    check_upload_size(content.length)
    File.open(file_path(name), 'wb') { |f| f.write(content) }
  end
  # just in case, restrict read access and prohibit write access to the uploaded file
  FileUtils.chmod(0440, file_path(name))
end