el_finder 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/Gemfile +4 -0
- data/{README.txt → README.rdoc} +5 -1
- data/Rakefile +7 -9
- data/el_finder.gemspec +24 -0
- data/lib/el_finder.rb +0 -4
- data/lib/el_finder/connector.rb +178 -48
- data/lib/el_finder/image_size.rb +2 -2
- data/lib/el_finder/pathname.rb +9 -0
- data/lib/el_finder/version.rb +3 -0
- data/test/test_el_finder.rb +329 -2
- data/test/test_el_finder_pathname.rb +24 -0
- metadata +28 -56
- data/History.txt +0 -19
- data/Manifest.txt +0 -22
data/.gitignore
ADDED
data/Gemfile
ADDED
data/{README.txt → README.rdoc}
RENAMED
@@ -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 '
|
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 '
|
4
|
-
|
3
|
+
require 'bundler'
|
4
|
+
Bundler::GemHelper.install_tasks
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
data/lib/el_finder/connector.rb
CHANGED
@@ -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
|
-
|
29
|
-
raise(RuntimeError, "
|
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
|
-
|
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
|
-
:
|
93
|
-
|
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
|
-
|
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
|
-
|
176
|
-
|
177
|
-
@response[:
|
178
|
-
|
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
|
-
|
182
|
-
|
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
|
185
|
-
|
232
|
+
if @params[:cut].to_i > 0
|
233
|
+
src.rename(dst)
|
186
234
|
else
|
187
|
-
|
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
|
-
|
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
|
-
@
|
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
|
227
|
-
|
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
|
320
|
+
if image_resize_handler.nil?
|
248
321
|
command_not_implemented
|
249
322
|
else
|
250
323
|
if @target.file?
|
251
|
-
|
252
|
-
|
253
|
-
|
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
|
-
|
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 =>
|
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/ &&
|
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 =>
|
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
|
data/lib/el_finder/image_size.rb
CHANGED
data/lib/el_finder/pathname.rb
CHANGED
@@ -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)
|
data/test/test_el_finder.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
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:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.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-
|
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:
|
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:
|
29
|
+
hash: 23
|
30
30
|
segments:
|
31
|
-
- 0
|
32
31
|
- 1
|
33
|
-
-
|
34
|
-
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 1.0.0
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
|
-
-
|
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
|
-
|
80
|
-
- Manifest.txt
|
81
|
-
- README.txt
|
44
|
+
extra_rdoc_files: []
|
45
|
+
|
82
46
|
files:
|
83
47
|
- .autotest
|
84
|
-
-
|
85
|
-
-
|
86
|
-
- README.
|
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://
|
72
|
+
homepage: http://github.com/phallstrom/el_finder
|
107
73
|
licenses: []
|
108
74
|
|
109
75
|
post_install_message:
|
110
|
-
rdoc_options:
|
111
|
-
|
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:
|
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
|