Class: ElFinder::Connector

Inherits:
Object
  • Object
show all
Defined in:
lib/el_finder/connector.rb,
lib/patches/patch_for_elfinder.rb

Overview

Represents ElFinder connector on Rails side.

Constant Summary collapse

VALID_COMMANDS =

Valid commands to run.

See Also:

%w[archive duplicate edit extract mkdir mkfile open paste ping read rename resize rm tmb upload]
DEFAULT_OPTIONS =

Default options for instances.

See Also:

{
  :mime_handler => ElFinder::MimeType,
  :image_handler => ElFinder::Image,
  :original_filename_method => lambda { |file| file.original_filename.respond_to?(:force_encoding) ? file.original_filename.force_encoding('utf-8') : file.original_filename },
  :disabled_commands => [],
  :allow_dot_files => true,
  :upload_max_size => '50M',
  :upload_file_mode => 0644,
  :archivers => {},
  :extractors => {},
  :home => 'Home',
  :default_perms => { :read => true, :write => true, :rm => true, :hidden => false },
  :perms => [],
  :thumbs => false,
  :thumbs_directory => '.thumbs',
  :thumbs_size => 48,
  :thumbs_at_once => 5,
  :tree_sub_folders => true, # list sub/sub folders in the tree
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Connector

Initializes new instance.

Parameters:

  • options (Hash)

    Instance options. :url and :root options are required.

Options Hash (options):

  • :url (String)

    Entry point of ElFinder router.

  • :root (String)

    Root directory of ElFinder directory structure.

Raises:

  • (ArgumentError)

See Also:



43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/el_finder/connector.rb', line 43

def initialize(options)
  @options = DEFAULT_OPTIONS.merge(options)

  raise(ArgumentError, "Missing required :url option") unless @options.key?(:url)
  raise(ArgumentError, "Missing required :root option") unless @options.key?(:root)
  raise(ArgumentError, "Mime Handler is invalid") unless mime_handler.respond_to?(:for)
  raise(ArgumentError, "Image Handler is invalid") unless image_handler.nil? || ([:size, :resize, :thumbnail].all?{|m| image_handler.respond_to?(m)})

  @root = ElFinder::Pathname.new(options[:root])

  @headers = {}
  @response = {}
end

Instance Attribute Details

#options=(value) ⇒ Hash (writeonly)

Options setter.

Parameters:

  • value (Hash)

    Options to be merged with instance ones.

Returns:

  • (Hash)

    Updated options.



118
119
120
121
122
123
# File 'lib/el_finder/connector.rb', line 118

def options=(value = {})
  value.each_pair do |k, v|
    @options[k.to_sym] = v
  end
  @options
end

Instance Method Details

#from_hash(hash) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/el_finder/connector.rb', line 98

def from_hash(hash)
  # restore missing '='
  len = hash.length % 4
  hash += '==' if len == 1 or len == 2
  hash += '='  if len == 3

  decoded_hash = Base64.urlsafe_decode64(hash)
  decoded_hash = decoded_hash.respond_to?(:force_encoding) ? decoded_hash.force_encoding('utf-8') : decoded_hash
  pathname = @root + decoded_hash
rescue ArgumentError => e
  if e.message != 'invalid base64'
    raise
  end
  nil
end

#run(params) ⇒ Object

Runs request-response cycle.

Parameters:

  • params (Hash)

    Request parameters. :cmd option is required.

Options Hash (params):

  • :cmd (String)

    Command to be performed.

See Also:



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/el_finder/connector.rb', line 61

def run(params)
  @params = params.dup
  @headers = {}
  @response = {}
  @response[:errorData] = {}

  if VALID_COMMANDS.include?(@params[:cmd])

    if @options[:thumbs]
      @thumb_directory = @root + @options[:thumbs_directory]
      @thumb_directory.mkdir unless @thumb_directory.exist? 
      raise(RuntimeError, "Unable to create thumbs directory") unless @thumb_directory.directory?
    end

    @current = @params[:current] ? from_hash(@params[:current]) : nil
    @target = (@params[:target] and !@params[:target].empty?) ? from_hash(@params[:target]) : nil
    if params[:targets]
      @targets = @params[:targets].map{|t| from_hash(t)}
    end

    send("_#{@params[:cmd]}")
  else
    invalid_request
  end

  @response.delete(:errorData) if @response[:errorData].empty?

  return @headers, @response
end

#to_hash(pathname) ⇒ Object



92
93
94
95
# File 'lib/el_finder/connector.rb', line 92

def to_hash(pathname)
  # note that '=' are removed
  Base64.urlsafe_encode64(pathname.path.to_s).chomp.tr("=\n", "")
end