Class: ElFinderFtp::Connector

Inherits:
Object
  • Object
show all
Defined in:
lib/el_finder_ftp/connector.rb

Overview

Represents ElFinder connector on Rails side.

Constant Summary collapse

VALID_COMMANDS =

Valid commands to run.

See Also:

%w[archive duplicate put file ls tree extract mkdir mkfile open paste ping get rename resize rm tmb upload]
DEFAULT_OPTIONS =

Default options for instances.

See Also:

{
  :mime_handler => ElFinderFtp::MimeType,
  :image_handler => ElFinderFtp::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 => ['archive', 'duplicate', 'extract', 'resize', 'tmb'],
  :allow_dot_files => true,
  :upload_max_size => '50M',
  :name_validator => lambda { |name| name.strip != '.' && name =~ /^[^\x00-\x1f\\?*:"><|\/]+$/ },
  :upload_file_mode => 0644,
  :archivers => {},
  :extractors => {},
  :home => 'Home',
  :default_perms => { :read => true, :write => true, :locked => false, :hidden => false },
  :perms => [],
  :thumbs => false,
  :thumbs_directory => '.thumbs',
  :thumbs_size => 48,
  :thumbs_at_once => 5,
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Connector

Initializes new instance.

Parameters:

  • options (Hash)

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

Options Hash (options):

  • :url (String)

    Entry point of ElFinder router.

  • :server (String)

    A hash containing the :host, :username, :password, and, optionally, :port to connect to

Raises:

  • (ArgumentError)

See Also:



46
47
48
49
50
51
52
53
54
55
56
# File 'lib/el_finder_ftp/connector.rb', line 46

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

  raise(ArgumentError, "Missing required :url option") unless @options.key?(:url) 
  raise(ArgumentError, "Missing required :server option") unless @options.key?(:server) 
  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)})

  @headers = {}
  @response = {}
end

Instance Attribute Details

#adapterObject (readonly)

Returns the value of attribute adapter.



17
18
19
# File 'lib/el_finder_ftp/connector.rb', line 17

def adapter
  @adapter
end

#options=(value) ⇒ Hash (writeonly)

Options setter.

Parameters:

  • value (Hash)

    Options to be merged with instance ones.

Returns:

  • (Hash)

    Updated options.



141
142
143
144
145
146
# File 'lib/el_finder_ftp/connector.rb', line 141

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

Class Method Details

.loggerObject



60
61
62
# File 'lib/el_finder_ftp/connector.rb', line 60

def logger
  @logger ||= Logger.new(STDOUT)
end

.logger=(val) ⇒ Object



63
64
65
# File 'lib/el_finder_ftp/connector.rb', line 63

def logger=(val)
  @logger = val
end

Instance Method Details

#from_hash(hash) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/el_finder_ftp/connector.rb', line 121

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:



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/el_finder_ftp/connector.rb', line 72

def run(params)

  @adapter = ElFinderFtp::FtpAdapter.new(@options[:server])
  @root = ElFinderFtp::Pathname.new(adapter)

  begin
    @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

      begin
        send("_#{@params[:cmd]}")
      rescue Net::FTPPermError
        @response[:error] = 'Access Denied'
      end
    else
      invalid_request
    end

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

    return @headers, @response
  ensure
    adapter.close
  end
end

#to_hash(pathname) ⇒ Object



115
116
117
118
# File 'lib/el_finder_ftp/connector.rb', line 115

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