el_finder 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.swp
2
+ pkg
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in cyp_mail_processor.gemspec
4
+ gemspec
@@ -21,10 +21,14 @@ open-source file manager for web, written in JavaScript using jQuery UI.
21
21
 
22
22
  == Requirements:
23
23
 
24
- The gem, by default, relies upon the 'imagesize' ruby gem and ImageMagick's 'mogrify' command.
24
+ The gem, by default, relies upon the 'image_size' ruby gem and ImageMagick's 'mogrify' command.
25
25
  These requirements can be changed by implementing custom methods for determining image size
26
26
  and resizing of an image.
27
27
 
28
+ NOTE: There is another ruby gem 'imagesize' that also defines the class ImageSize and requires 'image_size'
29
+ If you have that one installed, elfinder will fail. Make sure you only have 'image_size' installed if you use
30
+ the defaults.
31
+
28
32
  == Install:
29
33
 
30
34
  * Install elFinder (http://elrte.org/redmine/projects/elfinder/wiki/Install_EN)
data/Rakefile CHANGED
@@ -1,13 +1,11 @@
1
1
  # -*- ruby -*-
2
2
 
3
- require 'rubygems'
4
- require 'hoe'
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
5
 
6
- Hoe.spec 'el_finder' do
7
- developer('Philip Hallstrom', 'philip@pjkh.com')
8
- self.extra_deps = [
9
- ["imagesize",">=0.1.1"]
10
- ]
6
+ require 'rake/testtask'
7
+ Rake::TestTask.new(:test) do |test|
8
+ test.libs << 'lib' << 'test'
9
+ test.pattern = 'test/**/test_*.rb'
10
+ test.verbose = true
11
11
  end
12
-
13
- # vim: syntax=ruby
data/el_finder.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "el_finder/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "el_finder"
7
+ s.version = ElFinder::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Philip Hallstrom"]
10
+ s.email = ["philip@pjkh.com"]
11
+ s.homepage = "http://github.com/phallstrom/el_finder"
12
+ s.summary = %q{elFinder server side connector for Ruby.}
13
+ s.description = %q{Ruby library to provide server side functionality for elFinder. elFinder is an open-source file manager for web, written in JavaScript using jQuery UI.}
14
+
15
+ s.rubyforge_project = "el_finder"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency('image_size', '>= 1.0.0')
23
+
24
+ end
data/lib/el_finder.rb CHANGED
@@ -1,9 +1,5 @@
1
1
  require 'fileutils'
2
2
 
3
- module ElFinder
4
- VERSION = '1.0.0'
5
- end # of module ElFinder
6
-
7
3
  require 'el_finder/pathname'
8
4
  require 'el_finder/mime_type'
9
5
  require 'el_finder/image_size'
@@ -16,6 +16,8 @@ module ElFinder
16
16
  :archivers => [],
17
17
  :extractors => [],
18
18
  :home => 'Home',
19
+ :default_perms => {:read => true, :write => true, :rm => true},
20
+ :perms => []
19
21
  }
20
22
 
21
23
  #
@@ -24,15 +26,9 @@ module ElFinder
24
26
 
25
27
  raise(RuntimeError, "Missing required :url option") unless @options.key?(:url)
26
28
  raise(RuntimeError, "Missing required :root option") unless @options.key?(:root)
27
-
28
- @mime_handler = @options.delete(:mime_handler)
29
- raise(RuntimeError, "Mime Handler is invalid") unless @mime_handler.respond_to?(:for)
30
-
31
- @image_size_handler = @options.delete(:image_size_handler)
32
- raise(RuntimeError, "Image Size Handler is invalid") unless @image_size_handler.nil? || @image_size_handler.respond_to?(:for)
33
-
34
- @image_resize_handler = @options.delete(:image_resize_handler)
35
- raise(RuntimeError, "Image Resize Handler is invalid") unless @image_resize_handler.nil? || @image_resize_handler.respond_to?(:resize)
29
+ raise(RuntimeError, "Mime Handler is invalid") unless mime_handler.respond_to?(:for)
30
+ raise(RuntimeError, "Image Size Handler is invalid") unless image_size_handler.nil? || image_size_handler.respond_to?(:for)
31
+ raise(RuntimeError, "Image Resize Handler is invalid") unless image_resize_handler.nil? || image_resize_handler.respond_to?(:resize)
36
32
 
37
33
  @root = ElFinder::Pathname.new(options[:root])
38
34
 
@@ -43,6 +39,7 @@ module ElFinder
43
39
  #
44
40
  def run(params = {})
45
41
  @params = params.dup
42
+ @response[:errorData] = {}
46
43
 
47
44
  if VALID_COMMANDS.include?(@params[:cmd])
48
45
 
@@ -52,11 +49,15 @@ module ElFinder
52
49
  @targets = @params[:targets].map{|t| from_hash(t)}
53
50
  end
54
51
 
52
+
53
+
55
54
  send("_#{@params[:cmd]}")
56
55
  else
57
56
  invalid_request
58
57
  end
59
58
 
59
+ @response.delete(:errorData) if @response[:errorData].empty?
60
+
60
61
  return @headers, @response
61
62
  end # of run
62
63
 
@@ -70,6 +71,13 @@ module ElFinder
70
71
  pathname = ElFinder::Pathname.new_with_root(@root, Base64.decode64(hash))
71
72
  end # of from_hash
72
73
 
74
+ #
75
+ def options=(opts = {})
76
+ opts.each_pair do |k,v|
77
+ @options[k.to_sym] = v
78
+ end
79
+ end
80
+
73
81
  ################################################################################
74
82
  protected
75
83
 
@@ -79,7 +87,15 @@ module ElFinder
79
87
 
80
88
  if target.nil?
81
89
  _open(@root)
82
- elsif target.file?
90
+ return
91
+ end
92
+
93
+ if perms_for(target)[:read] == false
94
+ @response[:error] = 'Access Denied'
95
+ return
96
+ end
97
+
98
+ if target.file?
83
99
  command_not_implemented
84
100
  elsif target.directory?
85
101
  @response[:cwd] = cwd_for(target)
@@ -89,10 +105,8 @@ module ElFinder
89
105
  @response[:tree] = {
90
106
  :name => @options[:home],
91
107
  :hash => to_hash(@root),
92
- :read => @root.readable?,
93
- :write => @root.writable?,
94
- :dirs => tree_for(@root)
95
- }
108
+ :dirs => tree_for(@root),
109
+ }.merge(perms_for(@root))
96
110
  end
97
111
 
98
112
  if @params[:init]
@@ -117,6 +131,11 @@ module ElFinder
117
131
 
118
132
  #
119
133
  def _mkdir
134
+ if perms_for(@current)[:write] == false
135
+ @response[:error] = 'Access Denied'
136
+ return
137
+ end
138
+
120
139
  dir = @current + @params[:name]
121
140
  if !dir.exist? && dir.mkdir
122
141
  @params[:tree] = true
@@ -129,6 +148,11 @@ module ElFinder
129
148
 
130
149
  #
131
150
  def _mkfile
151
+ if perms_for(@current)[:write] == false
152
+ @response[:error] = 'Access Denied'
153
+ return
154
+ end
155
+
132
156
  file = @current + @params[:name]
133
157
  if !file.exist? && FileUtils.touch(file)
134
158
  @response[:select] = [to_hash(file)]
@@ -141,6 +165,19 @@ module ElFinder
141
165
  #
142
166
  def _rename
143
167
  to = @current + @params[:name]
168
+
169
+ perms_for_target = perms_for(@target)
170
+ if perms_for_target[:rm] == false
171
+ @response[:error] = 'Access Denied'
172
+ return
173
+ end
174
+
175
+ perms_for_current = perms_for(@current)
176
+ if perms_for_current[:write] == false
177
+ @response[:error] = 'Access Denied'
178
+ return
179
+ end
180
+
144
181
  if to.exist?
145
182
  @response[:error] = "Unable to rename #{@target.ftype}. '#{to.basename}' already exists"
146
183
  elsif @target.rename(to)
@@ -154,10 +191,15 @@ module ElFinder
154
191
 
155
192
  #
156
193
  def _upload
194
+ if perms_for(@current)[:write] == false
195
+ @response[:error] = 'Access Denied'
196
+ return
197
+ end
198
+
157
199
  select = []
158
200
  @params[:upload].to_a.each do |file|
159
201
  dst = @current + @options[:original_filename_method].call(file)
160
- File.rename(file.path, dst)
202
+ FileUtils.mv(file.path, dst)
161
203
  select << to_hash(dst)
162
204
  end
163
205
  @response[:select] = select
@@ -171,20 +213,30 @@ module ElFinder
171
213
 
172
214
  #
173
215
  def _paste
216
+ if perms_for(from_hash(@params[:dst]))[:write] == false
217
+ @response[:error] = 'Access Denied'
218
+ return
219
+ end
220
+
174
221
  @targets.to_a.each do |src|
175
- dst = from_hash(@params[:dst]) + src.basename
176
- if dst.exist?
177
- @response[:error] = 'Some files were unable to be copied'
178
- @response[:errorData] ||= {}
179
- @response[:errorData][src.basename] = "already exists in '#{dst.dirname.relative_path_from(@root)}'"
222
+ if perms_for(src)[:read] == false || (@params[:cut].to_i > 0 && perms_for(src)[:rm] == false)
223
+ @response[:error] ||= 'Some files were not copied.'
224
+ @response[:errorData][src.basename.to_s] = "Access Denied"
225
+ return
180
226
  else
181
- if @params[:cut].to_i > 0
182
- File.rename(src, dst)
227
+ dst = from_hash(@params[:dst]) + src.basename
228
+ if dst.exist?
229
+ @response[:error] ||= 'Some files were unable to be copied'
230
+ @response[:errorData][src.basename.to_s] = "already exists in '#{dst.dirname.relative_path_from(@root)}'"
183
231
  else
184
- if src.directory?
185
- FileUtils.cp_r(src, dst)
232
+ if @params[:cut].to_i > 0
233
+ src.rename(dst)
186
234
  else
187
- FileUtils.copy(src, dst)
235
+ if src.directory?
236
+ FileUtils.cp_r(src, dst)
237
+ else
238
+ FileUtils.copy(src, dst)
239
+ end
188
240
  end
189
241
  end
190
242
  end
@@ -198,7 +250,9 @@ module ElFinder
198
250
  if @targets.empty?
199
251
  @response[:error] = "No files were selected for removal"
200
252
  else
201
- FileUtils.rm_rf(@targets)
253
+ @targets.to_a.each do |target|
254
+ remove_target(target)
255
+ end
202
256
  @params[:tree] = true
203
257
  _open(@current)
204
258
  end
@@ -206,6 +260,17 @@ module ElFinder
206
260
 
207
261
  #
208
262
  def _duplicate
263
+ if perms_for(@target)[:read] == false
264
+ @response[:error] = 'Access Denied'
265
+ @response[:errorData][@target.basename.to_s] = 'Unable to read'
266
+ return
267
+ end
268
+ if perms_for(@target.dirname)[:write] == false
269
+ @response[:error] = 'Access Denied'
270
+ @response[:errorData][@target.dirname.to_s] = 'Unable to write'
271
+ return
272
+ end
273
+
209
274
  duplicate = @target.duplicate
210
275
  if @target.directory?
211
276
  FileUtils.cp_r(@target, duplicate)
@@ -218,13 +283,21 @@ module ElFinder
218
283
 
219
284
  #
220
285
  def _read
221
- @response[:content] = @target.read
286
+ if perms_for(@target)[:read] == true
287
+ @response[:content] = @target.read
288
+ else
289
+ @response[:error] = 'Access Denied'
290
+ end
222
291
  end # of read
223
292
 
224
293
  #
225
294
  def _edit
226
- @target.open('w') { |f| f.write @params[:content] }
227
- @response[:file] = cdc_for(@target)
295
+ if perms_for(@target)[:write] == true
296
+ @target.open('w') { |f| f.write @params[:content] }
297
+ @response[:file] = cdc_for(@target)
298
+ else
299
+ @response[:error] = 'Access Denied'
300
+ end
228
301
  end # of edit
229
302
 
230
303
  #
@@ -244,13 +317,17 @@ module ElFinder
244
317
 
245
318
  #
246
319
  def _resize
247
- if @image_resize_handler.nil?
320
+ if image_resize_handler.nil?
248
321
  command_not_implemented
249
322
  else
250
323
  if @target.file?
251
- @image_resize_handler.resize(@target, :width => @params[:width].to_i, :height => @params[:height].to_i)
252
- @response[:select] = [to_hash(@target)]
253
- _open(@current)
324
+ if perms_for(@target)[:write] == true
325
+ image_resize_handler.resize(@target, :width => @params[:width].to_i, :height => @params[:height].to_i)
326
+ @response[:select] = [to_hash(@target)]
327
+ _open(@current)
328
+ else
329
+ @response[:error] = 'Access Denied'
330
+ end
254
331
  else
255
332
  @response[:error] = "Unable to resize file. It does not exist"
256
333
  end
@@ -260,19 +337,51 @@ module ElFinder
260
337
  ################################################################################
261
338
  private
262
339
 
340
+ #
341
+ def remove_target(target)
342
+ if target.directory?
343
+ target.children.each do |child|
344
+ remove_target(child)
345
+ end
346
+ end
347
+ if perms_for(target)[:rm] == false
348
+ @response[:error] ||= 'Some files/directories were unable to be removed'
349
+ @response[:errorData][target.basename.to_s] = "Access Denied"
350
+ else
351
+ begin
352
+ target.unlink
353
+ rescue
354
+ @response[:error] ||= 'Some files/directories were unable to be removed'
355
+ @response[:errorData][target.basename.to_s] = "Remove failed"
356
+ end
357
+ end
358
+ end
359
+
360
+ #
361
+ def mime_handler
362
+ @options[:mime_handler]
363
+ end
364
+
365
+ #
366
+ def image_size_handler
367
+ @options[:image_size_handler]
368
+ end
369
+
370
+ #
371
+ def image_resize_handler
372
+ @options[:image_resize_handler]
373
+ end
374
+
263
375
  #
264
376
  def cwd_for(pathname)
265
377
  {
266
378
  :name => pathname.basename.to_s,
267
379
  :hash => to_hash(pathname),
268
380
  :mime => 'directory',
269
- :rel => (@options[:home] + '/' + pathname.relative_path_from(@root)),
381
+ :rel => (@options[:home] + '/' + pathname.relative_path_from(@root).to_s),
270
382
  :size => 0,
271
383
  :date => pathname.mtime.to_s,
272
- :read => pathname.readable?,
273
- :write => pathname.writable?,
274
- :rm => (pathname != @root && pathname.writable?),
275
- }
384
+ }.merge(perms_for(pathname))
276
385
  end
277
386
 
278
387
  # TODO - Implement link, linkTo, and parent
@@ -281,10 +390,8 @@ module ElFinder
281
390
  :name => pathname.basename.to_s,
282
391
  :hash => to_hash(pathname),
283
392
  :date => pathname.mtime.to_s,
284
- :read => pathname.readable?,
285
- :write => pathname.writable?,
286
- :rm => pathname.writable?,
287
393
  }
394
+ response.merge! perms_for(pathname)
288
395
 
289
396
  if pathname.directory?
290
397
  response.merge!(
@@ -300,14 +407,14 @@ module ElFinder
300
407
  elsif pathname.file?
301
408
  response.merge!(
302
409
  :size => pathname.size,
303
- :mime => @mime_handler.for(pathname),
304
- :url => (@options[:url] + '/' + pathname.relative_path_from(@root))
410
+ :mime => mime_handler.for(pathname),
411
+ :url => (@options[:url] + '/' + pathname.relative_path_from(@root).to_s)
305
412
  )
306
413
 
307
- if response[:mime] =~ /image/ && !@image_size_handler.nil? && !@image_resize_handler.nil?
414
+ if pathname.readable? && response[:mime] =~ /image/ && !image_size_handler.nil? && !image_resize_handler.nil?
308
415
  response.merge!(
309
416
  :resize => true,
310
- :dim => @image_size_handler.for(pathname)
417
+ :dim => image_size_handler.for(pathname)
311
418
  )
312
419
  end
313
420
 
@@ -321,12 +428,35 @@ module ElFinder
321
428
  root.children.select{ |child| child.directory? }.sort_by{|e| e.basename.to_s.downcase}.map { |child|
322
429
  {:name => child.basename.to_s,
323
430
  :hash => to_hash(child),
324
- :read => child.readable?,
325
- :write => child.writable?,
326
431
  :dirs => tree_for(child),
327
- }
432
+ }.merge(perms_for(child))
328
433
  }
329
434
  end # of tree_for
435
+
436
+ #
437
+ def perms_for(pathname, options = {})
438
+ skip = [options[:skip]].flatten
439
+ response = {}
440
+
441
+ response[:read] = pathname.readable? if pathname.exist?
442
+ response[:read] &&= specific_perm_for(pathname, :read)
443
+ response[:read] &&= @options[:default_perms][:read]
444
+
445
+ response[:write] = pathname.writable? if pathname.exist?
446
+ response[:write] &&= specific_perm_for(pathname, :write)
447
+ response[:write] &&= @options[:default_perms][:write]
448
+
449
+ response[:rm] = pathname != @root
450
+ response[:rm] &&= specific_perm_for(pathname, :rm)
451
+ response[:rm] &&= @options[:default_perms][:rm]
452
+
453
+ response
454
+ end # of perms_for
455
+
456
+ #
457
+ def specific_perm_for(pathname, perm)
458
+ @options[:perms].select{ |k,v| pathname.relative_path_from(@root).to_s.send((k.is_a?(String) ? :== : :match), k) }.none?{|e| e.last[perm] == false}
459
+ end # of specific_perm_for
330
460
 
331
461
  #
332
462
  def invalid_request
@@ -7,8 +7,8 @@ module ElFinder
7
7
 
8
8
  def self.for(pathname)
9
9
  return nil unless File.exist?(pathname)
10
- s = new(File.open(pathname)).get_size.join('x').to_s
11
- s = nil if s == 'x'
10
+ s = new(File.open(pathname)).size.to_s
11
+ s = nil if s.empty?
12
12
  return s
13
13
  end
14
14
 
@@ -1,3 +1,4 @@
1
+ require 'fileutils'
1
2
  require 'pathname'
2
3
 
3
4
  module ElFinder
@@ -14,6 +15,14 @@ module ElFinder
14
15
  self.class.new(super(*args).to_s)
15
16
  end
16
17
 
18
+ #
19
+ def rename(to)
20
+ super(to)
21
+ rescue Errno::EXDEV
22
+ FileUtils.move(self.to_s, to.to_s)
23
+ @path = to.to_s
24
+ end
25
+
17
26
  #
18
27
  def self.new_with_root(root, path = '')
19
28
  new(superclass.new(File.join(root, path)).cleanpath.to_s)
@@ -0,0 +1,3 @@
1
+ module ElFinder
2
+ VERSION = '1.0.2'
3
+ end
@@ -1,5 +1,6 @@
1
- require "test/unit"
2
- require "el_finder"
1
+ require 'test/unit'
2
+ require 'el_finder'
3
+ require 'pp'
3
4
 
4
5
  class TestElFinder < Test::Unit::TestCase
5
6
 
@@ -251,6 +252,332 @@ class TestElFinder < Test::Unit::TestCase
251
252
  assert_equal '50x25', ElFinder::ImageSize.for(File.join(@vroot, 'pjkh.png')).to_s
252
253
  end
253
254
 
255
+ ################################################################################
256
+
257
+ def test_default_permissions
258
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
259
+
260
+ assert_equal true, r[:cwd][:read]
261
+ assert_equal true, r[:cwd][:write]
262
+ assert_equal false, r[:cwd][:rm]
263
+
264
+ r[:cdc].each do |e|
265
+ assert_equal true, e[:read]
266
+ assert_equal true, e[:write]
267
+ assert_equal true, e[:rm]
268
+ end
269
+ end
270
+
271
+ def test_custom_permissions_on_root
272
+ @elfinder.options = {
273
+ :perms => {
274
+ '.' => {:read => false},
275
+ }
276
+ }
277
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
278
+ assert_match(/access denied/i, r[:error])
279
+ end
280
+
281
+ def test_custom_permissions
282
+ @elfinder.options = {
283
+ :perms => {
284
+ 'foo' => {:rm => false},
285
+ /.*.png$/ => {:rm => false},
286
+ /^pjkh/ => {:read => false},
287
+ 'README.txt' => {:write => false},
288
+ }
289
+ }
290
+
291
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
292
+
293
+ r[:cdc].each do |e|
294
+ case e[:name]
295
+ when 'elfinder.png'
296
+ assert_equal true, e[:read]
297
+ assert_equal true, e[:write]
298
+ assert_equal false, e[:rm]
299
+ when 'foo'
300
+ assert_equal true, e[:read]
301
+ assert_equal true, e[:write]
302
+ assert_equal false, e[:rm]
303
+ when 'pjkh.png'
304
+ assert_equal false, e[:read]
305
+ assert_equal true, e[:write]
306
+ assert_equal false, e[:rm]
307
+ when 'README.txt'
308
+ assert_equal true, e[:read]
309
+ assert_equal false, e[:write]
310
+ assert_equal true, e[:rm]
311
+ end
312
+ end
313
+ end
314
+
315
+ def test_custom_permissions_multiple_matches_prefers_false
316
+ @elfinder.options = {
317
+ :perms => {
318
+ 'pjkh.png' => {:read => false},
319
+ /pjkh/ => {:read => true},
320
+ }
321
+ }
322
+
323
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
324
+
325
+ r[:cdc].each do |e|
326
+ case e[:name]
327
+ when 'pjkh.png'
328
+ assert_equal false, e[:read]
329
+ assert_equal true, e[:write]
330
+ assert_equal true, e[:rm]
331
+ else
332
+ assert_equal true, e[:read]
333
+ assert_equal true, e[:write]
334
+ assert_equal true, e[:rm]
335
+ end
336
+ end
337
+ end
338
+
339
+ def test_custom_permissions_in_subdirectories
340
+ @elfinder.options = {
341
+ :perms => {
342
+ %r{foo/s.*} => {:read => false}
343
+ }
344
+ }
345
+
346
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
347
+ h, r = @elfinder.run(:cmd => 'open', :target => r[:cdc].find{|e| e[:name] == 'foo'}[:hash])
348
+
349
+ r[:cdc].each do |e|
350
+ case e[:name]
351
+ when 'sandy.txt', 'sam.txt'
352
+ assert_equal false, e[:read]
353
+ else
354
+ assert_equal true, e[:read]
355
+ end
356
+ end
357
+ end
358
+
359
+ def test_open_permissions
360
+ @elfinder.options = {
361
+ :perms => {
362
+ 'foo' => {:read => false}
363
+ }
364
+ }
365
+
366
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
367
+ target = r[:cdc].find{|e| e[:name] == 'foo'}
368
+ h1, r = @elfinder.run(:cmd => 'open', :target => target[:hash])
369
+ assert_match(/access denied/i, r[:error])
370
+ end
371
+
372
+ def test_mkdir_permissions
373
+ @elfinder.options = {
374
+ :perms => {
375
+ 'foo' => {:write => false}
376
+ }
377
+ }
378
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
379
+ target = r[:cdc].find{|e| e[:name] == 'foo'}
380
+ h1, r = @elfinder.run(:cmd => 'open', :target => target[:hash])
381
+
382
+ h, r = @elfinder.run(:cmd => 'mkdir', :current => r[:cwd][:hash], :name => 'dir1')
383
+ assert !File.directory?(File.join(@vroot, 'foo', 'dir1'))
384
+ assert_nil r[:select]
385
+ assert_match(/access denied/i, r[:error])
386
+ end
387
+
388
+ def test_mkfile_permissions
389
+ @elfinder.options = {
390
+ :perms => {
391
+ 'foo' => {:write => false}
392
+ }
393
+ }
394
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
395
+ target = r[:cdc].find{|e| e[:name] == 'foo'}
396
+ h1, r = @elfinder.run(:cmd => 'open', :target => target[:hash])
397
+
398
+ h, r = @elfinder.run(:cmd => 'mkfile', :current => r[:cwd][:hash], :name => 'file1')
399
+ assert !File.file?(File.join(@vroot, 'foo', 'file1'))
400
+ assert_nil r[:select]
401
+ assert_match(/access denied/i, r[:error])
402
+ end
403
+
404
+ def test_rename_permissions_file_rm_false
405
+ @elfinder.options = {
406
+ :perms => {
407
+ 'README.txt' => {:rm => false}
408
+ }
409
+ }
410
+
411
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
412
+ target = r[:cdc].find{|e| e[:name] == 'README.txt'}
413
+ h1, r = @elfinder.run(:cmd => 'rename', :target => target[:hash], :current => r[:cwd][:hash], :name => 'file1')
414
+ assert File.file?(File.join(@vroot, 'README.txt'))
415
+ assert !File.file?(File.join(@vroot, 'file1'))
416
+ assert_nil r[:select]
417
+ assert_match(/access denied/i, r[:error])
418
+ end
419
+
420
+ def test_rename_permissions_dir_write_false
421
+ @elfinder.options = {
422
+ :perms => {
423
+ '.' => {:write => false}
424
+ }
425
+ }
426
+
427
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
428
+ target = r[:cdc].find{|e| e[:name] == 'README.txt'}
429
+ h1, r = @elfinder.run(:cmd => 'rename', :target => target[:hash], :current => r[:cwd][:hash], :name => 'file1')
430
+ assert File.file?(File.join(@vroot, 'README.txt'))
431
+ assert !File.file?(File.join(@vroot, 'file1'))
432
+ assert_nil r[:select]
433
+ assert_match(/access denied/i, r[:error])
434
+ end
435
+
436
+ def test_upload_permissions
437
+ @elfinder.options = {
438
+ :perms => {
439
+ '.' => {:write => false}
440
+ }
441
+ }
442
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
443
+ uploads = []
444
+ uploads << File.open(File.join(@vroot, 'foo/philip.txt'))
445
+ h, r = @elfinder.run(:cmd => 'upload', :upload => uploads, :current => r[:cwd][:hash])
446
+ assert !File.exist?(File.join(@vroot, 'philip.txt'))
447
+ assert_nil r[:select]
448
+ assert_match(/access denied/i, r[:error])
449
+ end
450
+
451
+ def test_paste_permissions_on_dst
452
+ @elfinder.options = {
453
+ :perms => {
454
+ 'foo' => {:write => false}
455
+ }
456
+ }
457
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
458
+ targets = r[:cdc].select{|e| e[:mime] != 'directory'}
459
+ dst = r[:cdc].find{|e| e[:name] == 'foo'}
460
+
461
+ h, r = @elfinder.run(:cmd => 'paste', :targets => targets.map{|e| e[:hash]}, :dst => dst[:hash])
462
+ assert_match(/access denied/i, r[:error])
463
+ assert !File.exist?(File.join(@vroot, 'foo', 'README.txt'))
464
+ assert !File.exist?(File.join(@vroot, 'foo', 'pjkh.png'))
465
+ assert !File.exist?(File.join(@vroot, 'foo', 'elfinder.png'))
466
+ end
467
+
468
+ def test_paste_permissions_on_target
469
+ @elfinder.options = {
470
+ :perms => {
471
+ 'README.txt' => {:read => false}
472
+ }
473
+ }
474
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
475
+ targets = r[:cdc].select{|e| e[:mime] != 'directory'}
476
+ dst = r[:cdc].find{|e| e[:name] == 'foo'}
477
+
478
+ h, r = @elfinder.run(:cmd => 'paste', :targets => targets.map{|e| e[:hash]}, :dst => dst[:hash])
479
+ assert !File.exist?(File.join(@vroot, 'foo', 'README.txt'))
480
+ assert File.exist?(File.join(@vroot, 'foo', 'pjkh.png'))
481
+ assert File.exist?(File.join(@vroot, 'foo', 'elfinder.png'))
482
+ end
483
+
484
+ def test_rm_permissions_file_rm_false
485
+ @elfinder.options = {
486
+ :perms => {
487
+ /.*\.png/ => {:rm => false}
488
+ }
489
+ }
490
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
491
+ h, r = @elfinder.run(:cmd => 'rm', :targets => r[:cdc].map{|e| e[:hash]})
492
+
493
+ assert !File.exist?(File.join(@vroot, 'README.txt'))
494
+ assert File.exist?(File.join(@vroot, 'pjkh.png'))
495
+ assert File.exist?(File.join(@vroot, 'elfinder.png'))
496
+ assert !File.exist?(File.join(@vroot, 'foo'))
497
+
498
+ assert_match(/unable to be removed/i, r[:error])
499
+ assert_match(/access denied/i, r[:errorData].to_s)
500
+ end
501
+
502
+ def test_rm_permissions_chmod_perm_hack
503
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
504
+ File.unlink(File.join(@vroot, 'pjkh.png'))
505
+ h, r = @elfinder.run(:cmd => 'rm', :targets => r[:cdc].map{|e| e[:hash]})
506
+
507
+ assert_match(/unable to be removed/i, r[:error])
508
+ assert_match(/pjkh.png.*remove failed/i, r[:errorData].to_s)
509
+ end
510
+
511
+ def test_duplicate_permissions_file
512
+ @elfinder.options = {
513
+ :perms => {
514
+ 'README.txt' => {:read => false}
515
+ }
516
+ }
517
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
518
+ duplicate = r[:cdc].find{|e| e[:name] == 'README.txt'}
519
+ h, r = @elfinder.run(:cmd => 'duplicate', :target => duplicate[:hash])
520
+ assert !File.exist?(File.join(@vroot, 'README copy 1.txt'))
521
+ assert_match(/access denied/i, r[:error])
522
+ assert_match(/unable to read/i, r[:errorData].to_s)
523
+ end
524
+
525
+ def test_duplicate_permissions_directory
526
+ @elfinder.options = {
527
+ :perms => {
528
+ '.' => {:write => false}
529
+ }
530
+ }
531
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
532
+ duplicate = r[:cdc].find{|e| e[:name] == 'README.txt'}
533
+ h, r = @elfinder.run(:cmd => 'duplicate', :target => duplicate[:hash])
534
+ assert !File.exist?(File.join(@vroot, 'README copy 1.txt'))
535
+ assert_match(/access denied/i, r[:error])
536
+ assert_match(/unable to write/i, r[:errorData].to_s)
537
+ end
538
+
539
+
540
+ def test_read_file_permissions
541
+ @elfinder.options = {
542
+ :perms => {
543
+ 'README.txt' => {:read => false}
544
+ }
545
+ }
546
+
547
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
548
+ target = r[:cdc].find{|e| e[:name] == 'README.txt'}
549
+ h, r = @elfinder.run(:cmd => 'read', :target => target[:hash])
550
+
551
+ assert_nil r[:content]
552
+ assert_match(/access denied/i, r[:error])
553
+ end
554
+
555
+ def test_edit_permissions_write
556
+ @elfinder.options = {
557
+ :perms => {
558
+ 'README.txt' => {:write => false}
559
+ }
560
+ }
561
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
562
+ file = r[:cdc].find{|e| e[:name] == 'README.txt'}
563
+ h, r = @elfinder.run(:cmd => 'edit', :target => file[:hash], :content => 'Hello')
564
+ assert_match(/access denied/i, r[:error])
565
+ assert_not_equal 'Hello', File.read(File.join(@vroot, 'README.txt'))
566
+ end
567
+
568
+ def test_resize_permissions_write
569
+ @elfinder.options = {
570
+ :perms => {
571
+ 'pjkh.png' => {:write => false}
572
+ }
573
+ }
574
+ h, r = @elfinder.run(:cmd => 'open', :init => 'true', :target => '')
575
+ file = r[:cdc].find{|e| e[:name] == 'pjkh.png'}
576
+ h, r = @elfinder.run(:cmd => 'resize', :target => file[:hash], :current => r[:cwd][:hash], :width => '50', :height => '25')
577
+ assert File.exist?(File.join(@vroot, 'pjkh.png'))
578
+ assert_equal '100x100', ElFinder::ImageSize.for(File.join(@vroot, 'pjkh.png')).to_s
579
+ end
580
+
254
581
  end
255
582
 
256
583
  __END__
@@ -59,6 +59,30 @@ class TestElFinderPathname < Test::Unit::TestCase
59
59
 
60
60
  ################################################################################
61
61
 
62
+ def test_rename_on_same_filesystem
63
+ file = ElFinder::Pathname.new_with_root(@vroot, 'old.txt')
64
+ FileUtils.touch(file)
65
+ assert_equal true, File.exist?(File.join(@vroot, 'old.txt'))
66
+ file.rename(File.join(@vroot, 'new.txt'))
67
+ assert_equal false, File.exist?(File.join(@vroot, 'old.txt'))
68
+ assert_equal true, File.exist?(File.join(@vroot, 'new.txt'))
69
+ end
70
+
71
+ def test_rename_on_different_filesystem
72
+ if File.directory?('/Volumes/MyBook')
73
+ file = ElFinder::Pathname.new_with_root(@vroot, 'old.txt')
74
+ FileUtils.touch(file)
75
+ assert_equal true, File.exist?(File.join(@vroot, 'old.txt'))
76
+ file.rename('/Volumes/MyBook/elfinder.rename.test.safe.to.delete')
77
+ assert_equal false, File.exist?(File.join(@vroot, 'old.txt'))
78
+ assert_equal true, File.exist?('/Volumes/MyBook/elfinder.rename.test.safe.to.delete')
79
+ file.unlink
80
+ assert_equal false, File.exist?('/Volumes/MyBook/elfinder.rename.test.safe.to.delete')
81
+ end
82
+ end
83
+
84
+ ################################################################################
85
+
62
86
  def test_relative_to_method
63
87
  assert_equal "", ElFinder::Pathname.new_with_root(@vroot).relative_to(::Pathname.new(@vroot)).to_s
64
88
  assert_equal "foo.txt", ElFinder::Pathname.new_with_root(@vroot, 'foo.txt').relative_to(::Pathname.new(@vroot)).to_s
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: el_finder
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 0
10
- version: 1.0.0
9
+ - 2
10
+ version: 1.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Philip Hallstrom
@@ -15,82 +15,48 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-15 00:00:00 -07:00
18
+ date: 2010-12-31 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: imagesize
22
+ name: image_size
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- hash: 25
29
+ hash: 23
30
30
  segments:
31
- - 0
32
31
  - 1
33
- - 1
34
- version: 0.1.1
32
+ - 0
33
+ - 0
34
+ version: 1.0.0
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: rubyforge
39
- prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 7
46
- segments:
47
- - 2
48
- - 0
49
- - 4
50
- version: 2.0.4
51
- type: :development
52
- version_requirements: *id002
53
- - !ruby/object:Gem::Dependency
54
- name: hoe
55
- prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- hash: 19
62
- segments:
63
- - 2
64
- - 6
65
- - 2
66
- version: 2.6.2
67
- type: :development
68
- version_requirements: *id003
69
- description: |-
70
- Ruby library to provide server side functionality for elFinder. elFinder is an
71
- open-source file manager for web, written in JavaScript using jQuery UI.
37
+ description: Ruby library to provide server side functionality for elFinder. elFinder is an open-source file manager for web, written in JavaScript using jQuery UI.
72
38
  email:
73
39
  - philip@pjkh.com
74
40
  executables: []
75
41
 
76
42
  extensions: []
77
43
 
78
- extra_rdoc_files:
79
- - History.txt
80
- - Manifest.txt
81
- - README.txt
44
+ extra_rdoc_files: []
45
+
82
46
  files:
83
47
  - .autotest
84
- - History.txt
85
- - Manifest.txt
86
- - README.txt
48
+ - .gitignore
49
+ - Gemfile
50
+ - README.rdoc
87
51
  - Rakefile
52
+ - el_finder.gemspec
88
53
  - lib/el_finder.rb
89
54
  - lib/el_finder/connector.rb
90
55
  - lib/el_finder/image_resize.rb
91
56
  - lib/el_finder/image_size.rb
92
57
  - lib/el_finder/mime_type.rb
93
58
  - lib/el_finder/pathname.rb
59
+ - lib/el_finder/version.rb
94
60
  - test/files/README.txt
95
61
  - test/files/elfinder.png
96
62
  - test/files/foo/philip.txt
@@ -103,13 +69,12 @@ files:
103
69
  - test/test_el_finder_mime_type.rb
104
70
  - test/test_el_finder_pathname.rb
105
71
  has_rdoc: true
106
- homepage: http://elrte.org/redmine/projects/elfinder
72
+ homepage: http://github.com/phallstrom/el_finder
107
73
  licenses: []
108
74
 
109
75
  post_install_message:
110
- rdoc_options:
111
- - --main
112
- - README.txt
76
+ rdoc_options: []
77
+
113
78
  require_paths:
114
79
  - lib
115
80
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -136,8 +101,15 @@ rubyforge_project: el_finder
136
101
  rubygems_version: 1.3.7
137
102
  signing_key:
138
103
  specification_version: 3
139
- summary: Ruby library to provide server side functionality for elFinder
104
+ summary: elFinder server side connector for Ruby.
140
105
  test_files:
106
+ - test/files/README.txt
107
+ - test/files/elfinder.png
108
+ - test/files/foo/philip.txt
109
+ - test/files/foo/sam.txt
110
+ - test/files/foo/sandy.txt
111
+ - test/files/foo/tom.txt
112
+ - test/files/pjkh.png
141
113
  - test/test_el_finder.rb
142
114
  - test/test_el_finder_image_size.rb
143
115
  - test/test_el_finder_mime_type.rb
data/History.txt DELETED
@@ -1,19 +0,0 @@
1
- CHANGELOG
2
-
3
- 2010-10-15 Philip Hallstrom
4
-
5
- * update manifest
6
- * test each of the connector methods
7
- * use base64 encode/decode for hash to get around javascript unfriendly characters
8
- * add image size/resize handling
9
- * almost functionally complete
10
- * migrate over alpha code from past project
11
-
12
- 2010-10-14 Philip Hallstrom
13
-
14
- * begin work on connector
15
- * enforce that all pathnames reside beneath the root
16
- * initial library and tests for mime_type/pathname
17
- * bin/elfinder not necessary
18
- * Initial commit
19
-
data/Manifest.txt DELETED
@@ -1,22 +0,0 @@
1
- .autotest
2
- History.txt
3
- Manifest.txt
4
- README.txt
5
- Rakefile
6
- lib/el_finder.rb
7
- lib/el_finder/connector.rb
8
- lib/el_finder/image_resize.rb
9
- lib/el_finder/image_size.rb
10
- lib/el_finder/mime_type.rb
11
- lib/el_finder/pathname.rb
12
- test/files/README.txt
13
- test/files/elfinder.png
14
- test/files/foo/philip.txt
15
- test/files/foo/sam.txt
16
- test/files/foo/sandy.txt
17
- test/files/foo/tom.txt
18
- test/files/pjkh.png
19
- test/test_el_finder.rb
20
- test/test_el_finder_image_size.rb
21
- test/test_el_finder_mime_type.rb
22
- test/test_el_finder_pathname.rb