130 lines
3.8 KiB
Ruby
130 lines
3.8 KiB
Ruby
require 'fileutils'
|
|
require 'application'
|
|
require 'instiki_errors'
|
|
|
|
# Controller that is responsible for serving files and pictures.
|
|
# Disabled in version 0.10
|
|
|
|
class FileController < ApplicationController
|
|
|
|
layout 'default'
|
|
|
|
before_filter :check_allow_uploads
|
|
|
|
def file
|
|
check_path
|
|
if @params['file']
|
|
# form supplied
|
|
file_yard.upload_file(@file_name, @params['file'])
|
|
flash[:info] = "File '#{@file_name}' successfully uploaded"
|
|
@web.refresh_pages_with_references(@file_name)
|
|
return_to_last_remembered
|
|
elsif file_yard.has_file?(@file_name)
|
|
send_file(file_yard.file_path(@file_name))
|
|
else
|
|
logger.debug("File not found: #{file_yard.files_path}/#{@file_name}")
|
|
# go to the template, which is a file upload form
|
|
end
|
|
end
|
|
|
|
def cancel_upload
|
|
return_to_last_remembered
|
|
end
|
|
|
|
def pic
|
|
check_path
|
|
if @params['file']
|
|
# form supplied
|
|
file_yard.upload_file(@file_name, @params['file'])
|
|
@web.refresh_pages_with_references(@file_name)
|
|
flash[:info] = "Image '#{@file_name}' successfully uploaded"
|
|
return_to_last_remembered
|
|
elsif file_yard.has_file?(@file_name)
|
|
send_file(file_yard.file_path(@file_name))
|
|
else
|
|
logger.debug("Image not found: #{file_yard.files_path}/#{@file_name}")
|
|
render_action 'file'
|
|
end
|
|
end
|
|
|
|
def import
|
|
return if file_uploads_disabled?
|
|
|
|
check_authorization
|
|
if @params['file']
|
|
@problems = []
|
|
import_file_name = "#{@web.address}-import-#{Time.now.strftime('%Y-%m-%d-%H-%M-%S')}.zip"
|
|
file_yard.upload_file(import_file_name, @params['file'])
|
|
import_from_archive(file_yard.file_path(import_file_name))
|
|
if @problems.empty?
|
|
flash[:info] = 'Import successfully finished'
|
|
else
|
|
flash[:error] = "Import finished, but some pages were not imported:<li>" +
|
|
@problems.join('</li><li>') + '</li>'
|
|
end
|
|
return_to_last_remembered
|
|
else
|
|
# to template
|
|
end
|
|
end
|
|
|
|
protected
|
|
|
|
def check_allow_uploads
|
|
|
|
# TODO enable file uploads again after 0.10 release
|
|
unless RAILS_ENV == 'test'
|
|
render_text 'File uploads are not ready for general use in Instiki 0.10', '403 Forbidden'
|
|
return false
|
|
end
|
|
|
|
unless @web.allow_uploads
|
|
render_text 'File uploads are blocked by the webmaster', '403 Forbidden'
|
|
return false
|
|
end
|
|
end
|
|
|
|
|
|
private
|
|
|
|
def check_path
|
|
raise Instiki::ValidationError.new("Invalid path: no file name") unless @file_name
|
|
raise Instiki::ValidationError.new("Invalid path: no web name") unless @web_name
|
|
raise Instiki::ValidationError.new("Invalid path: unknown web name") unless @web
|
|
end
|
|
|
|
def file_yard
|
|
@wiki.file_yard(@web)
|
|
end
|
|
|
|
def import_from_archive(archive)
|
|
logger.info "Importing pages from #{archive}"
|
|
zip = Zip::ZipInputStream.open(archive)
|
|
while (entry = zip.get_next_entry) do
|
|
ext_length = File.extname(entry.name).length
|
|
page_name = entry.name[0..-(ext_length + 1)]
|
|
page_content = entry.get_input_stream.read
|
|
logger.info "Processing page '#{page_name}'"
|
|
begin
|
|
existing_page = @wiki.read_page(@web.address, page_name)
|
|
if existing_page
|
|
if existing_page.content == page_content
|
|
logger.info "Page '#{page_name}' with the same content already exists. Skipping."
|
|
next
|
|
else
|
|
logger.info "Page '#{page_name}' already exists. Adding a new revision to it."
|
|
wiki.revise_page(@web.address, page_name, page_content, Time.now, @author)
|
|
end
|
|
else
|
|
wiki.write_page(@web.address, page_name, page_content, Time.now, @author)
|
|
end
|
|
rescue => e
|
|
logger.error(e)
|
|
@problems << "#{page_name} : #{e.message}"
|
|
end
|
|
end
|
|
logger.info "Import from #{archive} finished"
|
|
end
|
|
|
|
end
|